最近在研究ffmpeg封装h264裸流为MP4相关问题,这里需要解释下为什么要封装h264视频,通过编码器得到的h264视频流仅仅是裸流,只包含一些流的头信息和视频数据,没有时间戳的概念,所以使用播放器播放h264视频时,会出现播放速度不正常的现象(我遇到的是快进现象),所以将h264封装成MP4格式可以添加时间戳的信息进去,即可使用播放器正常播放视频。
参考网上的代码(https://blog.youkuaiyun.com/u013699869/article/details/49616041 )之后,发现不能直接使用,而且没有说明如何使用,所以制作成自己的代码(代码参考链接 https://download.youkuaiyun.com/download/kingmingle/10798280 ),并介绍如何在ffmpeg中使用。
使用方法:
1.首先在Ubuntu下正常安装ffmpeg,并完成编译(参考Ubuntu下ffmpeg安装与编译);
2.将上面代码替换ffmpeg目录下doc/examples中任意一个.c文件中的代码(我替换的是muxing.c),准备好h264视频放在该目录下,然后修改代码中main函数中的输入视频名称;
3.直接在ffmpeg目录下使用make examples命令进行编译(可使用make examplesclean命令清除编译),生产可执行文件(我生成的是muxing可执行文件);
4.执行可执行文件(我的执行命令./muxing),即可完成h264封装成MP4格式。
注:在代码中,
int64_t calc_duration = (double)AV_TIME_BASE / av_q2d(in_stream->r_frame_rate);
这句代码就是计算两帧时间的时间戳(也即控制输出MP4视频播放速度),AV_TIME_BASE宏定义为1000000,in_stream->r_frame_rate表示输出的帧率。