求助:关于FFMPEG时间戳与视频帧不对齐的问题

yewei2608 2015-08-04 02:18:25
最近想用FFMPEG将视频解码成一帧一帧的图像,并拿到每一帧的时间戳。
但发现通过代码解析视频后,发现后面少了4帧(假如视频有169帧,解码出来只有165帧),并且还有另一个诡异的现象,时间戳恰恰又是前面少了4帧的时间戳。
代码大致如下:
AVRational tmp_AVRational = {1, AV_TIME_BASE};
int frameindex = 1
int frameFinished;
while(av_read_frame(pFormatCtx, &packet)>=0)
{
if(packet.stream_index==videoStream)
{
avcodec_decode_video2(pCodecCtx, pSrcFrame, &frameFinished, &packet);
if(frameFinished)
{
BlockFrame mframe ;
mframe.frame=frameindex;
mframe.time=av_rescale_q(packet.pts, pFormatCtx->streams[0]->time_base,tmp_AVRational);
...
将图像保存成frameindex.jpg
}
frameindex++;
av_free_packet(&packet);
}
av_free_packet(&packet);
}

后来经过自己的琢磨,
1)每次把frameFinished 打印出来,发现前面四帧frameFinished =0,但如果我把if(frameFinished) 这个判断条件去掉,前面的四帧图像保存出来的图片又是纯黑色的。
但想不通的是,与其他播放器一帧一帧看比较,如KMPLAY,QQ影音、Avidemux,是后面少了4帧,并不是前面。
2)另外,如果我将上面代码中的
BlockFrame mframe ;
mframe.frame=frameindex;
mframe.time=av_rescale_q(packet.pts, pFormatCtx->streams[0]->time_base,tmp_AVRational);
放到if外面,奇怪的事情又发生了,这四帧是有时间戳的,并且就是视频前四帧的时间戳。

之前没有接触过ffmpeg,请哪位大大指教下。
...全文
1181 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
rightorwrong 2018-09-12
  • 打赏
  • 举报
回复
可能前4帧不是I帧开始
gczcm 2018-09-10
  • 打赏
  • 举报
回复
因为使用了ffmpeg多线程解码,在初始化所有线程之前(仅返回大小),不会进行处理。使用 pSrcFrame.>pkt_pts,会发现当第一次出现frameFinished==1时, pSrcFrame.>pkt_pt=0,说明使用的是第一帧,则说明前四帧是有被处理的,而最后面帧是放在缓存中,while(av_read_frame(pFormatCtx, &packet)>=0) 不成立,而没有缓存没有被使用。https://blog.csdn.net/subfate/article/details/50273955

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧