1

FFMPEG v2.1 以降は、HEVC デコードのサポートを提供しています。入力として基本的な入力ビン ストリームを試しましたが、対応する YUV ファイルを取得しました。

ここで私の質問は、エレメンタリ ストリームを入力として渡すだけなので、デコーダはどのように解析するのでしょうか?

/libavformat/hevcdec.cのデマルチプレクサであるはずの を調べましたHEVC。HEVCデコーダーでファイルをデコードできるかどうかを検出するhevc_probe()機能があることを私は知っています。hevcdec.c

hevc_probe() 関数の定義を以下に示します。

static int hevc_probe(AVProbeData *p)
{
    uint32_t code = -1;
    int vps = 0, sps = 0, pps = 0, irap = 0;
    int i;

    for (i = 0; i < p->buf_size - 1; i++) {
        code = (code << 8) + p->buf[i];
        if ((code & 0xffffff00) == 0x100) {
            uint8_t nal2 = p->buf[i + 1];
            int type = (code & 0x7E) >> 1;

            if (code & 0x81) // forbidden and reserved zero bits
                return 0;

            if (nal2 & 0xf8) // reserved zero
                return 0;

            switch (type) {
            case NAL_VPS:        vps++;  break;
            case NAL_SPS:        sps++;  break;
            case NAL_PPS:        pps++;  break;
            case NAL_BLA_N_LP:
            case NAL_BLA_W_LP:
            case NAL_BLA_W_RADL:
            case NAL_CRA_NUT:
            case NAL_IDR_N_LP:
            case NAL_IDR_W_RADL: irap++; break;
            }
        }
    }

    // printf("vps=%d, sps=%d, pps=%d, irap=%d\n", vps, sps, pps, irap);

    if (vps && sps && pps && irap)
        return AVPROBE_SCORE_EXTENSION + 1; // 1 more than .mpg
    return 0;
}

私が読んだものによれば、この関数が type の定数を返す場合にのみAVPROBE_SCORE_EXTENSION、デコードが続行されます。戻っAVPROBE_SCORE_EXTENSION+1てるけどなんで?

また、上記のコードで見られるように、type取得した入力ビット コードから何らかの変数を決定し、sps、pps などの定数をインクリメントします。ストリーム?

誰かがエレメンタリ ストリームをデコードできるデコーダのパーサーの概要を説明できれば、誰にとっても本当に役に立ちます。

助けてください。前もって感謝します。

4

1 に答える 1

4

データ ストリームのタイプを自動的に検出することは、確率の問題です。特定のプローブ関数は特定のデータ型のファイルを探しますが、データがその型に準拠していることを完全に確信できるでしょうか? 誤検知はどうですか?たとえば、多くのマルチメディア ファイルの最初の 4 バイトには、4 つの ASCII 文字で構成される署名があります。プローブ関数がこれらの 4 文字をチェックし、同じ 4 文字で始まるランダムなテキスト ファイルが見つかった場合、それは誤検知になります。

検出に影響を与える可能性のあるさまざまな要因があるため、FFmpeg のプローブ関数は 0..100 の範囲の確実性値を返します (「絶対に適合しない」..「絶対はこのタイプです」)。AVPROBE_SCORE_EXTENSIONは 50 と定義されています。一部のファイル タイプには強力なシグネチャがなく、プローブ機能で実行できる最善の方法は、ファイルの拡張子をチェックすることです。

このすべての目的: エレメンタリ ストリームは、自動的に検出するのが少し難しい場合があります。そのため、十分な証拠を収集した後、HEVC エレメンタリ ストリーム プローブ検出は、このストリームが HEVC である確率を 51% 返すのに十分な信頼しかありません。FFmpeg はさまざまなプローブ関数を使用してストリームを実行するため、51% を超える確実性を返す場合、別の形式のプローブ関数がこの関数をオーバーライドする可能性があります。

エレメンタリ ストリームは一般的に「実際には」見られないことに注意してください。それらは、転送と処理に適した他の形式にパッケージ化される傾向があります (プログラム ストリームと転送ストリームを参照してください)。

于 2013-11-28T19:15:27.183 に答える