使用Ffmpeg同步解码视频

时间:2011-07-18 10:42:56

标签: video ffmpeg video-processing pts audio-video-sync

我正在使用Ffmpeg来解码和播放视频文件。我目前正在播放视频和播放音频的速度与CPU可以解码和显示的速度一样快。问题是我想使用系统时钟同步播放视频和音频。

我寻找了一些帮助,但找不到任何重要的东西,除了dranger tutorial 05但是我真的不明白他在做什么,因为我的程序不是和他的程序一样

我正在使用mjpeg文件,因此每次解码一帧时都会检索到pts,我将pts乘以time_base,因为dranger会以秒为单位获取值,但分辨率似乎只有几秒钟因此,当视频以每秒25帧的速度运行时,我得到值“6”25次然后“7”25次。

没有更准确的价值吗?或者获得更准确值的方法,如果是这样,我将如何同步到这个值?我正在使用SDL来显示值,所以我可以使用我得到的值的SDL_Delay()吗?

感谢您的时间,

Infinitifizz

1 个答案:

答案 0 :(得分:2)

要将pts或dts转换为浮点秒,请在适当的time_base上使用av_q2d():

// You got the context from open_input:
AVFormatContext *pFormatCtx;
avformat_open_input(&pFormatCtx, inputfilename, NULL, &format_opts);

// Get a stream from the context
AVStream pStream= pFormatCtx->streams[i];

// Convert packet time (here, dts) to seconds with:  
double seconds= (dts - pStream->start_time) * av_q2d(pStream->time_base);

// Or convert frame number to seconds with the codec context
AVCodecContext *pCodecCtx= pStream->pVideoStream->codec;
double seconds= framenumber * av_q2d(pCodecCtx->time_base);

这将以秒为单位返回从视频开始的时间。