需求: Android 端把网络摄像头的一段正在播放的视频流,截取保存成mp4(按录像按钮时开始录像)。
实现: ffmpeg + x264 + sdl;
h264 裸流 打包成MP4,在网上也有一大堆文章,ffmpeg 也有一个muxing 的 example,大致流程都是一样的,参考ffmpeg的muxing.c 就可以写一个。我这里把我在这个过程中遇到的问题写出来,这些问题困扰了我很久才解决,谁叫我是视频方面的小白呢。
这三个问题其实很简单,但如果对这方面不了解的话,耗掉的时间还是很多的。
1,dts,pts:
在write_frame()之前,每一个avpacket 数据都要设置 dts,pts,因为我的视频没有B帧,所以dts = pts 便可;pts 一开始我也不知道要怎么设, 参考muxing.c,设置成写入的帧数量便可(结合问题3);
2,sps,pps;
我接受到的裸流里面 sps +pps + i帧 是放在一个NALU 里面的,在保存成mp4时这个sps 非常重要,我一开始没有设置,打包后的Mp4 普通的播放器就不能识别;
sps 在创建 编码器时候传递给编码器; sps 是 00 00 00 01 后面的,不包含这个00 00 00 01 这个码;pps 我还没用到。
case AVMEDIA_TYPE_VIDEO:
c->codec_id = codec_id;
LOGE("add_stream AVMEDIA