求助:关于FFMPEG时间戳与视频帧不对齐的问题
最近想用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,请哪位大大指教下。