原有的API已被弃用,新的API如下:
Query
Setup
Usage
Cleanup
ps: FFmpeg给出的例子中并未while循环调用av_bsf_receive_packet,也未对其flush。
https://blogs.gentoo.org/lu_zero/2016/03/21/bitstream-filtering/
FFMpeg应该可以自动判断出视频文件的格式,不用再进行解码器的指定。要强制指定也可以,FFMpeg有一个 -f 参数,是用于强制指定文件格式的。但我只用过这个参数来指定过输出文件格式,如-f wav、-f jpg,而还没有用它指定过输入文件的格式。FFMpeg的核心在于调用编解码器。楼主可以规定输入文件的解码器和输出文件的编码器,使用-acodec和-vcodec,如:ffmpeg -i -acodec mp3 -vcodec h264 a.mp4 -acodec aac -vcodec h264 -crf 22 -strict -2 output.mp4 。解码器规定为h264(给视频流),mp3给音频流。编码器设置为h264和aac。https://www.jianshu.com/p/ecfbebadbe55集成方法这篇文章写得非常详细了,我就不再赘述。
有一点差异的地方,该文章集成后使用的是OC进行调用,我使用的是C语言,这样可以方便跨平台。因为FFmpeg本身是C语言的,我先用C封装成工具类,这样不依赖平台,上层用什么语言调都行。
这里实现一个简单的FFmpeg命令行格式转换功能。
新建my_test.c和头文件,在这个头文件里导入 #import "fftools/ffmpeg.h" ,因为ffmpeg.h头文件里导入了所有的模块,就不需要外面一个个导入了。
然后新建一个Demo-Bridging-Header.h头文件,导入上面创建的my_test.h的头文件
添加到工程配置里,这样就可以在Swift里调用了
要在Swift里使用C库,就要把文件路径传给C,接收C返回的结果。Swift里面的字符串是String,C里面一般是char*,它们之间相互转换方法如下(转换都是在Swift里进行的)。
在my_test.c里添加调用FFmpeg命令行的方法,上层直接传入完整的FFmpeg命令行str,用空格进行字符串分割后转换成字符串数组char *argv[50],调用ffmpeg_main方法处理。
将命令行cmd转换成UnsafeMutablePointer<CChar>后,直接调用C里面的do_cmd方法即可。
点击按钮,从手机相册里选一张gif动图,转换成mp4视频,保存到相册。
有两个小问题:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)