本工程是基于FFmpeg4.2.3,在工程里面也有一个3.3.2的版本,有需要的可以自己去Git库里面checkout,工程17年就做好了,一直没有开源,原谅我懒,哈哈哈
源码地址:https://github.com/bookzhan/bzffmpegcmd.git
工程支持进度回调,移动端常用的的功能都支持,如果需要支持更多的功能需要重新编译FFmpeg,请参考我之前的编译工程:https://120.27.239.50/wordpress/index.php/2020/05/26/ffmpeg-build-android/ 来启用更多的FFmpeg所支持的功能。
工程大致结构如下:
思路是这样的,FFmpeg本来就是只支持命令行调用的,也就是它的main函数,我们要做的就是基于这个函数进行改造,原始工程有很多exit_program操作,这个在电脑上的命令行工具调用没有问题,但是在Android手机上直接退出就有问题了,这个需要改,还有就是一些静态,全局变量使用之后需要还原,最后就是支持进度回调了。需要注意的是之前我工程里面包含cpp文件,然后怎么编译都会有问题,最后全部改成c文件编译成功了。
1.首先你需要把这些文件从FFmpeg源文件中Copy出来,以及编译过后的头文件copy过来
cmdutils.c
cmdutils.h
ffmpeg.c
ffmpeg.h
ffmpeg_filter.c
ffmpeg_hw.c
ffmpeg_opt.c
2.然后把编译好的libbzffmpeg.so放到对应的jniLibs下面,作为依赖库
3.修改源文件里面的exit_program函数,并全局搜索使用了的地方,然后在使用过exit_program函数的后面加上return逻辑,这么做是为了保持原始程序的调用流程
4.把ffmpeg.c里面静态以及全局变量还原到初始值,在ffmpeg_cleanup函数里面,如下:
ffmpeg_exited = 1;
nb_filtergraphs = 0;
progress_avio = NULL;
input_streams = NULL;
nb_input_streams = 0;
input_files = NULL;
nb_input_files = 0;
output_streams = NULL;
nb_output_streams = 0;
output_files = NULL;
nb_output_files = 0;
run_as_daemon = 0;
nb_frames_dup = 0;
dup_warning = 1000;
nb_frames_drop = 0;
want_sdp = 1;
5.写回调函数
我们可以看到,写文件都是在write_packet函数里面,那么我们可以根据 当前帧的时间/总时间 这样就可以计算出进度了,具体的看代码