ffmpeg解码h264图像帧:av_parser_parse2()//解码不拷贝数据问题!
来源:互联网 发布:图文并茂用什么软件 编辑:程序博客网 时间:2024/06/03 14:53
问题描述:http://bbs.csdn.net/topics/390713826
问题解决:http://blog.yikuyiku.com/?p=3486#comments
使用libav转码视频时发现一个问题:
使用下面这段代码解码视频时,视频尾巴上会丢掉几帧。
1
while
(av_read_frame(ifmt_ctx,&packet) >= 0){
2
ret = avcodec_decode_video2(video_dec_ctx, vframe, &got_frame, &packet);
3
if
(got_frame) {
4
packet.pts = av_rescale_q(packet.pts,video_dec_st->time_base,video_enc_st->time_base);
5
write_video_frame(ofmt_ctx,video_enc_st,vframe);
6
}
7
}
这是因为源视频中PTS与DTS的不同造成的。
av_read_frame()按照PTS顺序读帧的时候,如果此帧需要参考后面的帧,那么此时avcodec_decode_video2()是没有能力解码此帧的,表现为got_frame返回0。
比如说遇上如下EFGH四帧:
ID : E F G H
KIND: I B P P
PTS : 1 2 3 4
DTS : 1 4 2 3
那么顺序读到F时,由于F需要参考G帧,而此时我们还没读到G帧,我们是没有解码F的能力的,got_frame就返回0了。如果我们对此事不做处理,那么我们就会丢掉一个帧(但丢掉的未必是F,因为av_read_frame()和avcodec_decode_video2()是1:1调用的)。
所以我们需要在while(av_read_frame())读完整个视频后,继续调用avcodec_decode_video2()把之前那些没有成功解码的帧都解出来。调用的次数就是之前got_frame返回0的次数。
按照上述思路变更代码为以下,成功找回丢失的帧。
01
int
skipped_frame = 0;
02
03
while
(av_read_frame(ifmt_ctx,&packet) >= 0){
04
ret = avcodec_decode_video2(video_dec_ctx, vframe, &got_frame, &packet);
05
if
(got_frame) {
06
packet.pts = av_rescale_q(packet.pts,video_dec_st->time_base,video_enc_st->time_base);
07
write_video_frame(ofmt_ctx,video_enc_st,vframe);
08
}
09
else
10
{
11
skipped_frame++;
12
}
13
}
14
15
for
(
int
i=skipped_frame; i>0; i--)
16
{
17
ret = avcodec_decode_video2(video_dec_ctx, vframe, &got_frame, &packet);
18
if
(got_frame) {
19
packet.pts = av_rescale_q(packet.pts,video_dec_st->time_base,video_enc_st->time_base);
20
write_video_frame(ofmt_ctx,video_enc_st,vframe);
21
}
22
}
0 0
- ffmpeg解码h264图像帧:av_parser_parse2()//解码不拷贝数据问题!
- ffmpeg 解码h264数据
- ffmpeg 解码h264数据
- ffmpeg 解码h264数据
- ffmpeg 解码h264数据
- ffmpeg 解码h264数据
- ffmpeg 解码h264数据
- FFmpeg纯净版解码 av_parser_parse2
- ffmpeg--h264帧内解码
- ffmpeg编译,解码 H264
- FFMPEG解码H264拼帧简解
- FFMPEG解码H264拼帧简解
- ffmpeg 解码h264
- ffmpeg编译,解码 H264
- ffmpeg编译,解码 H264
- ffmpeg编译,解码 H264
- ffmpeg--编码解码h264
- ffmpeg编译,解码 H264
- HDU_ACM-2005 第几天?
- 二维数组中的查找
- 乱写
- iOS 之贝塞尔曲线介绍
- subline Text 3 主题
- ffmpeg解码h264图像帧:av_parser_parse2()//解码不拷贝数据问题!
- Can’t connect to MySQL server有关linux tcp连接优化
- The Twin Towers+uva+简单dp(最长公共子序列)
- web页面跳转
- 定制iOS 7中的导航栏和状态栏
- IO之内核buffer----"buffer cache"
- 解决PCBSD中的“ipfw: getsockopt(IP_FW_GET): Protocol not available”问题
- HDU_ACM-2006 求奇数的乘积
- 第二章 线性表