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

所需积分/C币:10 2017-04-27 21:35:12 691KB PDF
20
收藏 收藏
举报

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

...展开详情
试读 17P ffmpeg的编译以及ffmpeg命令行工具在android上的移植
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
放弃1111111 我没有成功不知道哪里的问题
2017-07-08
回复
如果按照说明的环境,进行编译,肯定能成功的。如果成功后执行一次就闪退,请参考博客中说明的修正http://blog.csdn.net/feixiangsmile/article/details/72677264
__NICK 资源很好,可以使用,谢谢博主。
2017-05-18
回复
请进入博客http://blog.csdn.net/feixiangsmile/article/details/72677264,这篇文章我对此文档中发现的问题进行了修正
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
上传资源赚积分or赚钱
    最新推荐
    ffmpeg的编译以及ffmpeg命令行工具在android上的移植 10积分/C币 立即下载
    1/17
    ffmpeg的编译以及ffmpeg命令行工具在android上的移植第1页
    ffmpeg的编译以及ffmpeg命令行工具在android上的移植第2页
    ffmpeg的编译以及ffmpeg命令行工具在android上的移植第3页
    ffmpeg的编译以及ffmpeg命令行工具在android上的移植第4页

    试读结束, 可继续读2页

    10积分/C币 立即下载 >