2

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

我四处寻找一些帮助,但除了 dranger 的教程 05之外找不到任何实质性的东西,但我真的不明白他在做什么,因为我的程序与他的编写方式不同。

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

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

谢谢你的时间,

无限化

4

1 回答 1

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);

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

于 2012-03-17T16:20:10.773 回答