ffmpeg 添加 sps pps

ffmpeg 添加 sps pps,第1张

分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。H.264码流的SPS和PPS信息存储在AVCodecContext结构体的extradata中。需要使用ffmpeg中名称为“h264_mp4toannexb”的bitstream filter处理。

原有的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视频,保存到相册。

有两个小问题:


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11290080.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存