没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
ffmpeg 最简单的转码封装 mp4 文件
分类: C/C++
本例简单实现了解码后的 video 重新编码 264 之后在 mux 成 MP4 文件的过
程,主要是用来记录 muxing 的方法。
下面详细说一下细节:
大家都知道一般解码出来的数据都是播放顺序,解码器是将编码顺序的数据
重新按照解码后的播放顺序输出的。而编码器是把数据根据解码需要的顺序重
新排序保存的。
当然,以上情况只在有帧的情况下才有用,否则只有 IP 帧的话解码和编码的
顺序是一样的
比如:解码后的数据是 IBBP,那要将这个数据编码的话,编码后的数据保存
的格式就是 IPBB
这只是内部的处理,对于用 ffmpeg 的库的我们不用太过关心 ,但是 , 要注
意,我们将数据塞给编码器的时候,要给顺序的播放加上顺序的时间标记,其
实很简单只要保证你送给编码器的每一 frame 的 pts 都是顺序的就可以了,否
则编码器会报 “non-strictly-monotonic pts at frame” , 究其原因,是因为编码
器需要送进来的 frame 时间上是递增的,为什么需要这个就得去本研究编码器
了
点击(此处)折叠或打开
1. if( pic.i_pts <= largest_pts )
2. {
3. if( cli_log_level >= X264_LOG_DEBUG || pts_warning_cnt <
MAX_PTS_WARNING )
4. x264_cli_log( "x264", X264_LOG_WARNING, "non-
strictly-monotonic pts at frame %d (%"PRId64" <= %"PRId64")",
5. i_frame, pic.i_pts, largest_pts );
6. else if( pts_warning_cnt == MAX_PTS_WARNING )
7. x264_cli_log( "x264", X264_LOG_WARNING, "too many
nonmonotonic pts warnings, suppressing further ones" );
8. pts_warning_cnt++;
9. pic.i_pts = largest_pts + ticks_per_frame;
10. }
在将数据送到编码器后,进行编码输出得到的 pkt 有自己的 pts 和 dts 等数据,
但是这个数据记得吗?是用我们自己送进去的 pts 来表示的,所以在和原来的
audio mux 的时候,会出现严重的音视频不同步,现在想想这个问题,就很容
易理解了,两边的 pts 差距很大,当然解码后做同步的时候会差很多。
其实 ffmpeg 在解码的时候将解码出来的顺序时间戳给了 frame 的 pkt_pts 这个
成员,所以我们可以直接用这个值赋值给 frame 的 pts,在送进编码器,这样编
码出来的 pkt 中的时间戳就和原来的 audio 对上了。
资源评论
shagn
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功