6

time_baseffmpeg とはどういう意味ですか? ドキュメント(ここ)は、「フレーム/秒」であると述べています。そして、実際の例で次のことがわかります。

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

しかし、ビデオのAVCodecContext->time_base== 1001 / 60000

これは私をかなり混乱させます、そして私はそれらを理解していません。

2 番目の質問は、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 は、1 秒あたりのフレーム数の逆数でもあり、等しくはありません。したがって、30 fps の場合、これはタイム ベースが 30 ではなく 1/30 であることを意味します。

于 2012-09-03T10:13:09.720 に答える
2

satuon のコメント リンクのすべてのフィールドを多数のビデオ ファイルでテストしたところ、正しいフレームレートは次のように計算できるようです。

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

... pFormatCtxAVFormatContext はどこで、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 に答える