6

time_base在 ffmpeg中是什么意思?文档(此处)说它是“每秒帧数”。我在一个真实的例子中看到:

AVFormatContext->streams[video_index]->time_base== 1 / 30000

但是视频的AVCodecContext->time_base== 1001 / 60000

这让我很困惑,我不明白他们。

第二个问题是关于av_seek_frame方法。如果通过时间戳进行搜索(最后一个参数是 AVSEEK_FLAG_BACKWARD 或 0),则从av_seek_frame读取的当前位置开始搜索?还是从文件的开头?还是从最后一次av_seek_frame调用后的解码开始位置开始?

4

3 回答 3

9

但是视频的 AVCodecContext->time_base == 1001 / 60000

这让我很困惑,我不明白他们。

time_base 是 AVRational 类型,它是一个由分子和分母组成的有理数,而不是使用小数点。我认为他们不只是使用 double 的原因是这样你就不会失去任何精度。

AVRational 在源代码中定义为:

typedef struct AVRational{
    int num; ///< numerator
    int den; ///< denominator
} AVRational;

time_base 也是每秒帧数的倒数,不等于它。所以如果你有 30 fps,这意味着时基是 1/30,而不是 30。

于 2012-09-03T10:13:09.720 回答
3

不要使用 r_frame_rate,因为它是 libavformats 的猜测,并不准确。(见http://ffmpeg.org/pipermail/ffmpeg-devel/2005-May/003079.html

AVCodecContext.time_base 给出了准确的 fps。如果 ticks_per_frame 为 2,则将 time_base 缩小 1/2。例如,如果 AVCodecContext.time_base (1, 60) 和 ticks_per_frame 为 1,则 fps 为 60。如果 ticks_per_frame 为 2,则 fps 为 30。

如果 AVCodecContext->time_base 为 (1001, 60000),则 fps 为 60。

AVCodecContext 的 time_base 与 fps 有关。

AVStream 的 time_base 仅用于 AVStream 中的方法中的时间单位,例如获取一帧的时间,或 .start 变量。

AVPacket 还有另一个 time_base。但是从 ffmpeg-devel 开始,他们更喜欢使 AVPacket.time_base 与 AVStream 相同。

于 2013-05-24T16:37:20.063 回答
2

我用一些视频文件测试了来自 satuon 评论链接的所有字段,看起来好像可以计算出正确的帧率:

double framerate = av_q2d(pFormatCtx->streams[videoStream]->r_frame_rate);

...pFormatCtx您的 AVFormatContext 在哪里,并且videoStream是您的视频流的索引,使用以下代码找到:

int videoStream = -1;
for (uint i=0; i < pFormatCtx->nb_streams; i++) {
    if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO && videoStream < 0) {
        videoStream = i;
    }
}

使用 ffmpeg 1.1。

于 2013-01-15T23:47:44.220 回答