ffmpeg的编译以及ffmpeg命令行工具在android上的移植


-
ffmpeg的编译过程详解,ffmpeg命令行工具在android 上的移植,通过ndk-build或者cmake方式在android studio2.2,ndk14(官网下载android studio2.2,然后通过studio上sdk下载ndk-bundle)构建工程项目。使用的ffmpeg是3.3版本,目前为最新的(现在是2017年4月27日)。由于本人花费很长时间做出来的,所以要求分有点高,另外,如果你按照步骤执行仍然不能正确,可能是你操作有误或者编译环境导致。
configure -refx= SPREFⅨX\ target-os=linux cross-prefiX=STOOLCHAIN/ bin/arm-linux-androideabi-\ arch=arm sysroot=SPLATFORM\ extra-cflags="-ISPLATFORM/usr/include"\ Cc=STOOLCHAIN/bin/arm-linux-androideabi-gcc nm=STOOLCHAIN/bin/arm-linux-androideabi-nm disable-shared enable-runtime-cpudetect enable-gpl - enable-small enable-cross-compile disable-debug -enable- static --disable-doc disable-asm disable-ffmpeg\ disable-ffplay disable-ffprobe disable-ffserver disable-postproc disable-avdevice --disable-symver disable-stripping make clean make -j4 STOOLCHAIN/bin/arm- linux-androideabi-ld -rpath-link=SPLATFORM/usr/lib LS PLATFORM/usr/lib\ LS PREFIX/lib soname libffmpeg so-shared-nostdlib-Bsymbolic--whole-archive--no-undefined-o\ SPREFIX/libffmpeg so libavcodec/libavcodec. a libavfilter /libavfilter a libswresample/libswresample a libavformat/libavformat. a libavutil/libavutil a libswscale/libswscale. a -IC-Im-Iz-ldI -llog -- linker=/system/bin/linker STOOLCHAIN/lib/gcc/arm-linux-androideabi/4. 9/libgcc. a arm ivf CPU=armv7-a OPTIMIZE CFLAGS="-mfloat-abi=softfp-mfpu=vfp -marm- march=S CPU PREFIX=/android/SCPU-vfp ADDITIONAL CONFIGURE FLAG= build one she脚本建立好后,需要通过 chmod命令对文件进行设置可执行权限,例如 chmod777 build_ android.sh;然后执行此shel|脚木即可(/ build_ android.sh),然后在 ffmpeg根目录卜 就会生成 android目录,此目录下是arm7avfp目录(这里的 android/armv7avfp目录就是 she脚本中PREFⅨ变量设置的),进入armv7-avfp下就是编译生成的库以及需要的头文件 口 include libffmpeg 50 至此,就可以使用 libffmpeg.So共享库了。 注:上述中的she‖脚本是用于生成单个共享库的,如果生成多个模块的共享库。则只体步 骤如下 a:在源码中,修改 FFmpeg的 configure文件(对于合称为个共享库的情况,此处所述的 修改与否都可以)。原因:由于编译出来的动态库文件名的版本号在.so之后(例如 Hlibavcodec.so.5.100.1″),而 android平台不能识别这样文件名,所以需要修改这种文件名。 在 configure文件中找到卜面儿行代码 SLIBNAME_WITH_MAJOR='S(SLIBNAME)S(LIBMAJOR LIB_ INSTALL EXTRA CMD='SS(RANLIB)"S(LIBDIR)/S(LIBNAME)" SLIB_ INSTALL_ NAME='S(SLIBNAME_WITH VERSION) SLIB INSTALL LINKS='S(SLIBNAME WITH MAJOR)S(SLIBNAME) 替换为卜面内容: SLIBNAME_ WITH_ MAJOR='S(SLIBPREF)S(FULLNAME)-S(LIBMAJOR)S(SLIBSUF) LIB INSTALL EXTRA CMD='SS(RANLIB)"S(LIBDIR)/S(LIBNAME)" SLIB_INSTALL _NAME='S(SLIBNAME_ WITH_ MAJOR) SLIB INSTALL_LINKS='S(SLIBNAME) 由于编译成共享库,则需要对本中的配置- disable- shared和- enable- static替换成如下 enable- shared和- disable- static。上面中的最下面的红色部分去掉即可 编译成功后,在 android/armv7-a-vp/lib目录下就是各个功能模块的库文件。 基于命令行工具的应用移植 本文使用的 android studio是2.2版本,win764位操作系统上 、通过 android studio建立一个项目 在此不在详述工程建立的过程。最终的项目结构如下 这里是ndk- build编译方式的目录结构 v E ffmpegstudy D: \AdroidWorkspace \fmpe □. gradle p□idea □ extern alNative Build p□buid □lbs V□src □ androidtest maIn I cpp 口 armeabi-v7a Android mk 自 Application. mk L cmdutilsc Eh cmdutils h Eh cmdutils common opts.h th config. h L ffmpeg 画 ffmpeg. h LE ffmpeg_filter L FFmpeg_jni. c FFI E ffmpeg_opt.c 2 libffmpegso h logjam.h java res c AndroidManifest xml test 、需要的文件介绍 把上述arm7av文件复制到cp目录下,并更名为 armeabj-v7a(注:因为上述编译配 置的就是arm处理器abiv7a架构的库),这个名字还要和模块 gradle一致(在下面 gradle 中我使用红色标出了) log jam.h内容如下 #ifndef LOGJAM H #define Log jAm h #include <android/log. h> #define logtag fempeglog #define LOGV(.) android log print(ANDROID LOG VERBOSE, LOGTAG, VA ARGS #define LOGD( android log print(ANDROID LOG DEBUG, LOGTAG VA ARGS #define LOGI(.) android log print(aNdroid LOG INFo, LOGTAG VA ARGS #define lofw(.) android log print(ANdroid LOG Warn, LOGTAG, VA ARGS #define oge (. android log print (android LOG error, LOGtag VA ARGS #endif FFmpeg jni.c为jni文件,用于调用c代码,内容如下: #include <stdio. h> #include ffmpeg jni.h #include ffmpeg. #include log jam. h void custom log (void *ptr, int level, const char* fmt, va list v1)i //To tXT file FILE *fp-fopen("/storage/emulated/0/av log. txt","a+") if (fp)i vfprintf(fp, fmt, v1) fflush(fp); fclose(fp) JNIEXPoRt jint JNICALL Java com example ffmpegstudy app FFmpegkit run (NIErIy *eny, class obj, jobjectArray commands)( //FFmpeg av log( callback v log set callback(cus tomm log); int argc=(*env)->GetArrayLength( env. commands char米argv[argc] int 1 for(i=0; i< argc: i++) istring js= (jstring) (env)->GetObjectArrayElement(env cOmmands, i) argv[i]=(char*)(env)->GetStringUTFChars(env, js, 0) return ffmpegmain(argc, argv) fFmpeg jni.h文件内容如下: #include <jni. h> #ifndef FFMPEg NI H #define FFMPeg jni h #ifdef cplusplus eⅹtern" JNIEXPORT jint JNICALL Java com example ffmpegstudy app FFmpegkit run (JNIEnv ** class, jobjectArray) #ifdef cplusplus fendi #endif Mainactivitv.java内容如下 public class mainActivity extends AppCompatActivity String base= Environment. getExternalStorageDirectory (. getPatho) private String[ n Commands @Override protected void onCreate(Bundle savedInstanceState)t super on Create(savedInstanceState) setContentView(R layout activity main TextView textView =(TextView)findViewById(R id tv info) tring dir= merge avi //把命名类似为0001.bm顺序命名的图片转化为avi格式的视频 cOmmands new String[lt integ base+"/pic/‰04d.bmp",//类似于0001.bmp命名的图片 vcodec mpeg bases -dirt /"+"merge. avi StringBuilder strBuilder= new SuringBuilderO for (int i=0: i cOmmands length; i++)i f(i +1!=cOmmands. length strBuilder append(cOmmands [i]+m) strBuilder append (cOmmands[i]) textView. setText(strBuilder) *按钮响应事件 半 aram view 米/ public void run (View view) FFmpegkit. execute(cOmmands, new FFmpegkit KitInterfaceo @Override public void onStarto I Toast. makeText(MainActivity this, FFmpeg begin to execute.., Toast. LENGTH SHORT) show O OVerride public void onProgress(int progress) Toast. makeText(MainActivity this,FFmpeg onProgress t progress, Toast. LENGTH SHORT) show O @Overrid public void onEnd(int result)( Toast. make TexL(MainActivity. this, FFmpeg end."+ result, Toast. LENGTH SHORT) show o) }) FFmpegkit.java内容如下: public class Ffmpegkit i oublic interface KitInterface i d onStar void onProgress(int progress) void onEnd (int result) static( System loadLibrary( ffmpeg") System loadLibrary( ffmpeginvoke ") public static void execute(String[] commands, final KitInterface kitIntenrface)[ new AsyncTask<String[], Integer, Integer)o( @Override protected void onPreExecuteo if(kitIntenrface !-nul1 kitIntenrface. onStartO @Override protected Integer doInBackground(String[] return run(params Lo]) @Overri protected void onProgressUpdate(Integer.. values) i if (kitIntenrface !=null)[ kitintenrfa pRogress(values lo]) @Override protected void onPostExecute(Integer integer)f if(kitIntenrface 11){ kitIntenrface. onEnd (integer) 1. execute(commands) private native static int run(String[] commands) activity main.xm1内容如下: K?xmI version=1.0 encoding="utf-8?> <Linearlayout xmins:android=http://schemas.androidcom/apk/res/android xmins:tools="http://schemas.androidcom/tools android: id=@+id/activity main android: layout width-"match parent android: layout height=" match parent android: paddingBottom-@dimen/activity vertical margin android: paddingLeft=@dimen/activity horizontal margin android: paddingRight= @dimen/ activity horizontal margin android: paddingtop-"@dimen/activity vertical margin android orientation= vertical < Textview android: id-@+id/ty info android: layout width=wrap content android: layout height="wrap contenl

-
2017-07-08
- 如果按照说明的环境,进行编译,肯定能成功的。如果成功后执行一次就闪退,请参考博客中说明的修正http://blog.csdn.net/feixiangsmile/article/details/72677264
-
2017-05-18
- 请进入博客http://blog.csdn.net/feixiangsmile/article/details/72677264,这篇文章我对此文档中发现的问题进行了修正
49.45MB
编译FFmpeg到Android studio中
2016-11-04编译FFmpeg并整合到android studio中。
8.62MB
FFMPEG编译的静态库文件
2017-01-12使用ffmpeg2.7按照网上教程编译的,作者没有给出库,我编译分享一下. 仅仅收一分体现一下其本身的价值.
52.10MB
FFmpeg For Android (三) 移植main函数到安卓上执行ffmpeg命令
2016-11-25FFmpeg For Android (三) 移植main函数到安卓上执行ffmpeg命令 完整源码 执行在安卓上执行ffmpeg命令, 示范了音频剪切和视频格式转换 有了它 你可以做很多有趣的app
110KB
ffmpeg完美移植到arm
2016-06-30具体的交叉编译器根据自己的arm交叉编译器,修改~
3.15MB
NDK编译的最新ffmpeg,支持RTSP流
2014-03-18通过修改了一下文件终于移植了最新的ffmpeg,里面还包括了提供给用户的头文件。最新的ffmpeg,支持RTSP。已经测试过。http://blog.csdn.net/nieyongs/article
3.87MB
ffmpeg for Android包含头文件和编译好的so库 可直接使用
2018-06-07ubuntu下编译ffmpeg 2.5.1 包含头文件和so库,可直接移植使用。
102KB
移植ffmpeg到arm平台.rar
2019-07-01主要说明移植ffmpeg到arm板端的流程,注意替换交叉编译链
12.29MB
ffmpeg-compile-shared-library-for-android, 移植ffmpeg到android,编译可用于jni调用的so库..zip
2019-10-10ffmpeg-compile-shared-library-for-android, 移植ffmpeg到android,编译可用于jni调用的so库.
1.38MB
华为HI3559A-opencv-ffmpeg-contrib交叉编译.docx
2020-06-23解决在交叉编译过程中,opencv始终无法正确加载ffmpeg视频库的问题。首先编译好ffmpeg动态库,并对opencv里ffmpeg-test进行编译论证,然后在cmake-gui的配置选项中添加
26.77MB
安卓移植FFmpeg静态链接库+头文件
2014-01-09大名鼎鼎FFmpeg不用我多解释,这个是移植编译可以在NDK中使用FFmpeg + libx264静态链接库外加我所编译版本的FFmpeg头文件。你可以利用它在NDK做视频编码解码等工作,或者下载ff
734B
FFmpeg 移植 Android
2019-04-15NULL 博文链接:https://superonion.iteye.com/blog/1609777
1.71MB
Android移植ffmpeg2.0解码器
2013-09-03本资源深度裁剪于ffmpeg2.0解码器中的H264视频解码部分,编译成Android可调用的SO文件。附带有Android make文件以及JNI接口C源码文件等,特别适合于android下的视频开
23B
ffmpeg开发之旅(5):详解ffmpeg编译与在Android平台上的移植-附件资源
2021-03-02ffmpeg开发之旅(5):详解ffmpeg编译与在Android平台上的移植-附件资源
109KB
FFmepg移植到iOS后需要调用ffmpeg命令所需的ffmeg.c文件
2015-12-13编译ffmpeg后,得到了include和lib库,但是想用ffmpeg命令(就像在终端那样),就需要我的这个ffmpegh里面的文件,添加到xcode项目,然后直接通过ffmpeg_main就可以调
56.93MB
音视频学习实践,从移植ffmpeg库到android平台
2020-12-30音视频学习实践,从移植ffmpeg库到android平台,混合编译x264库以及fdk-aac库,到相机音频采集编码推流到RTMP服务器的学习记录
52.77MB
ffmpeg-4.2.2-win64-static.rar(找不到64位ffmpeg.exe的小朋友往这里看)
2020-04-17FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库l
80.58MB
FFmpeg应用包2020年10月份
2020-10-12FFmpeg的应用包。方便下载。 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包
67.14MB
ffmpeg-latest-win64-static.zip
2020-05-14FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库l
70.82MB
ffmpeg-imx6q
2018-07-10ffmpeg移植到imx6q平台,linux 3.0.35,交叉编译器为:gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12,包含需要的源码及编译好的二进制文件。
4.90MB
android ffmpeg so库.zip
2020-05-18本资源为android交叉编译的ffmpeg so库,集成了libx264, freetype, fdk-aac。 资源文件里面同时包含了这些库所需要的头文件。亲测可用。
11.83MB
ffmpeg源码
2018-07-10FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库l
-
下载
Gradient-Centralization-TensorFlow:实现Gradient Centralization并允许其在TensorFlow中用作Python包-源码
Gradient-Centralization-TensorFlow:实现Gradient Centralization并允许其在TensorFlow中用作Python包-源码
-
下载
求职-源码
求职-源码
-
学院
LVS + Keepalived 实现 MySQL 负载均衡与高可用
LVS + Keepalived 实现 MySQL 负载均衡与高可用
-
博客
postgresql连接mysql_postgresql如何连接数据库
postgresql连接mysql_postgresql如何连接数据库
-
学院
C/C++反汇编解密
C/C++反汇编解密
-
学院
朱老师鸿蒙系列课程第1期-2鸿蒙系统Harmonyos源码架构分析
朱老师鸿蒙系列课程第1期-2鸿蒙系统Harmonyos源码架构分析
-
博客
pom文件找不到子项目_maven工程依赖的jar包,在本地仓库有,但是pom.xml文件却报错找不到jar包...
pom文件找不到子项目_maven工程依赖的jar包,在本地仓库有,但是pom.xml文件却报错找不到jar包...
-
下载
基于压缩感知的条带SAR缺失数据恢复成像方法
基于压缩感知的条带SAR缺失数据恢复成像方法
-
下载
React应用-源码
React应用-源码
-
下载
项目1:该项目将利用前几周学到的技能-源码
项目1:该项目将利用前几周学到的技能-源码
-
下载
百柱-源码
百柱-源码
-
学院
vue3从0到1-超详细
vue3从0到1-超详细
-
下载
光学数据处理的傅里叶变换分光光度计
光学数据处理的傅里叶变换分光光度计
-
学院
MySQL 视图
MySQL 视图
-
学院
MySQL 数据库的基本操作(数据完整性约束)
MySQL 数据库的基本操作(数据完整性约束)
-
博客
post get java_java – POST请求变为GET
post get java_java – POST请求变为GET
-
下载
STEM课程-设计环保水坝.zip
STEM课程-设计环保水坝.zip
-
学院
MySQL 管理利器 mysql-utilities
MySQL 管理利器 mysql-utilities
-
博客
calculator java_Java-Calculator
calculator java_Java-Calculator
-
博客
java sql server 连接池_java – 在Tomcat上配置SQL Server连接池
java sql server 连接池_java – 在Tomcat上配置SQL Server连接池
-
学院
《文件和目录操作命令》<Linux核心命令系列Series> <2.>
《文件和目录操作命令》<Linux核心命令系列Series> <2.>
-
学院
FFmpeg4.3系列之16:WebRTC之小白入门与视频聊天的实战
FFmpeg4.3系列之16:WebRTC之小白入门与视频聊天的实战
-
下载
源代码java-源码
源代码java-源码
-
学院
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小
-
博客
poj1979 java_算法总结—深度优先搜索DFS
poj1979 java_算法总结—深度优先搜索DFS
-
学院
MySQL Router 实现高可用、负载均衡、读写分离
MySQL Router 实现高可用、负载均衡、读写分离
-
学院
云开发后台+微信扫码点餐小程序+cms网页管理后台 含后厨端和用户端
云开发后台+微信扫码点餐小程序+cms网页管理后台 含后厨端和用户端
-
学院
Oracle_11g_Linux到Linux_DataGuard部署
Oracle_11g_Linux到Linux_DataGuard部署
-
下载
DbOperate.java
DbOperate.java
-
博客
java中condition_Java中Condition的使用
java中condition_Java中Condition的使用