IJKPlayer编译FFmpeg命令行_ijkplayer 编译ffmpeg-程序员宅基地

技术标签: android  音视频开发  ffmpeg  ijkplayer  

编译环境

Win10 + Oracle VM + Ubuntu 19

NDK version: r10e

编译CMD进IJK中,使用正常的IJK编译方法即可。

编译HTTPS进入IJK中

  • 拉取IJK后,进入文件夹目录进行命令编译
  • ./init-android-openssl.sh
  • ./init-android.sh

完成后进入下一步

编译SSL和FFMPEG

在config文件夹中选择自己的编译选项,一般来说用默认就ok(我是默认)
进入android/contrib执行如下命令

  • ./compile-openssl.sh clean
  • ./compile-openssl.sh all
  • ./compile-ffmpeg.sh clean
  • ./compile-ffmpeg.sh all

结束后开始编译IJK,回到android目录(cd …

  • ./compile-ijk.sh all

当编译结束后,可以尝试运行一下ijk的example代码了,尝试看看https是否能成功运行。

编译FFmpeg命令行

上述操作执行完成后,能够在对应的CPU框架下找到so包,那么这就是之前ffmpeg编译好的。直接拿来使用就好了。

编写C,MK,Java
cmd.c
//cpp的写法不同,请注意

#include <jni.h>
#include "fftools/ffmpeg.h"

JNIEXPORT jint JNICALL
Java_tv_danmaku_ijk_media_player_1armv7a_Pragma_FFmpegExec(JNIEnv *env,jclass type,jobjectArray cmd){
    int len = (*env)->GetArrayLength(env,cmd);
    char *argv[len];
    int i;
    for(i = 0;i < len;++i){
        argv[i] = (char *) (*env)->GetStringUTFChars(env,(jstring) (*env)->GetObjectArrayElement(env,cmd,i),0);
    }
    return ffmpeg_exec(len,argv);
}

下面这些各个属性啥意思请自行理解,也不是很难(虽然现在是CMakeList.txt方式去编译)

Android.mk
LOCAL_PATH := $(call my-dir)
FFMPEG_FILES := $(realpath $(MY_APP_ANDROID_ROOT)/contrib/ffmpeg-armv7a/fftools)
INCLUDE_FILES := $(realpath $(FFMPEG_FILES)/..)

include $(CLEAR_VARS)
LOCAL_MODULE := ffmpegcmd
LOCAL_SRC_FILES := cmd.c $(FFMPEG_FILES)/cmdutils.c $(FFMPEG_FILES)/ffmpeg.c $(FFMPEG_FILES)/ffmpeg_filter.c $(FFMPEG_FILES)/ffmpeg_hw.c $(FFMPEG_FILES)/ffmpeg_opt.c
LOCAL_C_INCLUDES := $(INCLUDE_FILES)
LOCAL_SHARED_LIBRARIES := ijkffmpeg
include $(BUILD_SHARED_LIBRARY)
# 我这里没有导入android的log,请自行查阅

能看到上面导入了ffmpeg.c之内的文件,这些能够在\android\contrib\中ffmpeg的各个CPU架构中找到

package tv.danmaku.ijk.media.player_armv7a;
//native方法使用
//Pragma
public class Pragma {
    public static native int FFmpegExec(String[] cmd);
}

修改ffmpeg文件

找到ffmpeg.c文件,将最底下的main方法修改为ffmpeg_exec,并在ffmpeg.h中增加这一方法
int ffmpeg_exec(int argc, char **argv);

并在C的最后的末尾添加如下内容:

	.........
	if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate < decode_error_stat[1])	
		exit_program(69);
	//重置
    nb_filtergraphs = 0;
    nb_output_files = 0;
    nb_output_streams = 0;
    nb_input_files = 0;
    nb_input_streams = 0;
//    exit_program(received_nb_signals ? 255 : main_return_code);防止系统退出报错
	......

接着找到cmdutil.c,找到exit_program方法,将内容置空即可

void exit_program(int ret)
{
//    if (program_exit)
//        program_exit(ret);

//    exit(ret);
}

上述源文件是用的链接的方式使用的,也可以将这些文件放入工程中使用,譬如这样:
在这里插入图片描述
如上编写完了后,回到/android目录下,使用脚本:

  • ./compile-ijk.sh armv7a(我这里只编译armv7,其他的太麻烦就没有编了)

如果想在其他平台上也支持也可以自己尝试编译其他版本so包

使用

可直接调用方法传入参数:

Pragma.FFmpegExec(new String[]{
                    "ffmpeg","-i", Environment.getExternalStorageDirectory()+"/ysgs.mp4",
                    "-ss","10","-t","10",
                    "-c", "copy",
                    Environment.getExternalStorageDirectory()+"/tem.mp4"
            });

ffmpeg的命令请自行查阅。

END

如此整个编译就结束了,可以使用IJK的同时对视频进行编辑(裁剪音视频轨道替换等。。。。)

PS:如果Ubuntu报告找不到NDK的位置,请自行配置(或者在相应脚本中增加变量ANDROID_NDK)

直接取用,fork from ijk,基于IJK编译:
IJK_CMD

不依赖IJK的话,如下方式:
NDK R2编译ffmpeg命令行

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34206863/article/details/105051358

智能推荐

html怎么遍历二维数组,原生js for循环遍历二维数组、嵌套元素的简单示例-程序员宅基地

文章浏览阅读1.4k次。这篇文章主要为大家详细介绍了原生js for循环遍历二维数组、嵌套元素的简单示例,具有一定的参考价值,可以用来参考一下。关于for循环这是js中的重点,特别是项目中会经常用到,并且它的运用范围还极其的广泛,极其的复杂,今天就来遍历一个多层嵌套的元素,先来看看简单的布局:我的好友张安李三张四nonono不认识的人王五刘四赵三黑名单刘八李八周六这种布局就是ul里有li然后li里又嵌套着ul,并且不是单..._html如何调用二维数组中的元素

Android音频框架之二 用户录音启动流程源码走读_audio remote_submix 录音-程序员宅基地

文章浏览阅读7.1k次,点赞2次,收藏5次。前言此篇是对《Android音频框架之一 详解audioPolicy流程及HAL驱动加载》的延续,此系列博文是记录在Android7.1系统即以后版本实现内录音功能。当用户使用 AudioRecord 录音 API 时,private void init() { int minBufferSize = AudioRecord.getMinBufferSize(kSampleRate, kChannelMode, kEncodeFormat); _audio remote_submix 录音

【c语言】—动态内存分配 超详细版本-程序员宅基地

文章浏览阅读4.2k次,点赞15次,收藏88次。讲解C语言中的动态内存分配,主讲malloc、calloc和realloc_动态内存分配

中兴zxj10服务器,中兴ZXJ10大客户服务网-固话信天游-程序员宅基地

文章浏览阅读267次。一 前言随着国内电信市场竞争的加剧,现在的集团客户不但关注资费政策,而且要求运营商能够提供各种满足个性化需求的业务组合。因此,对原有业务的升级和新业务、新功能的提供就成为决定电信运营商大客户市场竞争胜败的关键因素。能够提供有线无线一体化、广域Centrex、密码计费、预付费、固话信天游、话费即时知、一呼双应等多种特色业务的中兴ZXJ10大客户服务网整体解决方案,是中兴通讯为运营商倾力打造的利器,使..._中兴zxj10 sm4c

初始Linux的基本操作_桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统-程序员宅基地

文章浏览阅读652次。Linux的相关概念和理解Linux的基本指令ls,cd,pwd, touch, mkdir, whoami, tree, adduser, userdel实现_桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统

centos8使用命令修改主机名_centos8stream 关于的名称-程序员宅基地

文章浏览阅读1.1k次。hostnamectl set-hostname layuiFilehostname #查看主机名然后先跳到普通用户再exit退到root看其生效或reboot重启生效_centos8stream 关于的名称

随便推点

VSCode常用插件-程序员宅基地

文章浏览阅读1.1w次,点赞22次,收藏52次。一、VSCode常用的插件Chinese (Simplified)汉化Auto Rename TagOne Dark Pro颜色主题格式化代码(vscode系统自带)open in browser浏览器预览页面Live Server实时预览(推荐)vscode-icons设置文件图标主题Easy LESS编译less文件会了吧学习单词插件1.Chinese (Simplified)vscode下载完毕是英文版的,先安装这个插件,改为......_vscode常用插件

webstorm手动更新软件_webstorm在哪更新-程序员宅基地

文章浏览阅读1.7k次。webstorm手动更新软件打开软件,进入设置settings搜索Updates点击check now按弹出框内容点击 下载更新_webstorm在哪更新

python基础教程第三版下载,python零基础入门书籍pdf_python编程:从入门到实践(第3版) pdf-程序员宅基地

文章浏览阅读246次,点赞7次,收藏2次。Python 虽是一门成熟的语言,但也像其他语言一样在不断发展。第3版的编写过程从始至终令人愉悦python100行代码画皮卡丘。主要修订目标依然是确保精练、简单易懂。能具备动手开发项目所需的一切知识,同时为进一步学习打下坚实的基础。为此,修订了部分章节,以反映如何利用 Python 中的新方式更简单地完成任务,还澄清了对Python语言的某些细节描述得不太准确的地方。所有的项目都做了全面修订,采用得到良好维护的流行库,让你能够充满信心地用它们来开发自己的项目。_python编程:从入门到实践(第3版) pdf

db2look导出数据库表结构用法_db2look导出表结构-程序员宅基地

文章浏览阅读7.7k次。对于db2数据库,导入和导出表结构和数据其实很简单,只需要用到db2look和db2move两个命令即可。这两个命令都需要在客户端的命令行处理器中执行,但对于数据库服务器和客户端不在同一机器上的,需要借助catalog命令,来先完成远程数据库加载到本地,然后再进行导出导入操作。 如果是远程操作,则先需要把远程的数据库信息加载到本地,如果是本地则跳过1和2,从3开始,具体如下: ..._db2look导出表结构

Coursera—Andrew Ng机器学习—课程笔记 Lecture 5 Octave Tutorial-程序员宅基地

文章浏览阅读575次。定义函数 squareThisNumber(x),内容如下:

超级应用 - 免费应用内测托管平台|APP应用分发平台|iOS应用分发|Android应用分发|免费应用内测托管平台 源码下载_awjd1.tv-程序员宅基地

文章浏览阅读4k次。网站标题:超级应用 - 免费应用内测托管平台|APP应用分发平台|iOS应用分发|Android应用分发|免费应用内测托管平台源码下载网站关键词:超级应用(www.awwjd.com) 为您提供测试测试应用、应用托管、分发测试、兼容测试等,为客户提供APP托管和免费的下载分发渠道!源码下载网站描述:超级应用,分发平台,内测平台,内测分发,app分发,ios企业签名,ios分发平台,ios免签封装,苹果企业签名,苹果超级签名,免签封装,应用打包,苹果App下载,安卓应用,苹果应用,扫码下载,UDID,iO_awjd1.tv