4

プロジェクトをテストしています。MPEG-4 ts パケットのペイロード データ (一部のバイトをゼロにする) を、ユーザーからのパーセンテージで分割する必要があります。「.ts」ファイルのパケットをパケット(188バイト)ごとに読み取ることでそれを行っています。しかし、ビデオはプロセスの後で本当に泥だらけに変化しています. (ちなみに私はC言語でプログラムを書いています)

そこで、I フレームに属するデータ/パケットを見つけ、それらに触れずに他のデータをパーセンテージでスクランブルすることにしました。私は以下を見つけることができました

(16 進数) 00 00 00 01 E0 ビデオ PES パケットの開始 .. .. 00 00 01 B8 グループ オブ ピクチャ ヘッダーの開始 .. .. 00 00 01 00 ピクチャ スタート コード。これは 32 ビットです。この直後の 10 ビットは、一時参照と呼ばれます。したがって、時間参照には、ピクチャ スタート コードに続くバイトと、ピクチャ スタート コードの後の 2 番目のバイトの最初の 2 ビット、つまり 1 バイト (8 ビット) + 2 ビットが含まれます。これらはスキップする必要があります。ここで、存在する 3 ビット (ピクチャ スタート コードからの 2 番目のバイトの 3、4、および 5 番目のビット) は、フレーム タイプ、つまり I、B、または P を示します。 0x38 と右シフト >> 3 で。

たとえば、データはそのようなものです。

00 00 01 00 00 0F FF F8 00 00 01 B5..........など。

ここで、最初の 4 バイト 00 00 01 00 はピクチャ スタート コードです。5 番目のバイトと 6 番目のバイトの最初の 2 ビットは、一時的な参照です。したがって、問題は 6 番目のバイトにあります --> 0F

((0F & 38)>>3)

フレーム タイプ = 1 ==> I フレーム

フレーム タイプ 000 禁止

フレームタイプ 001 イントラコード化 (I) - iframe

フレームタイプ 010 予測符号化 (P) - p フレーム

フレーム タイプ 011 双方向予測符号化 (B) - b フレーム

ただし、これは MPEG-2 用です。MPEG-4トランスポートストリーム(拡張子は「.ts」)のビット演算でフレームタイプを認識して取得するパターンはあるのでしょうか?

そして、そのフレームに属するバイト数またはパケット数を取得する必要がありますか?

助けてくれてどうもありがとう

4

2 に答える 2

7

完全な TS パケットを解析します。そのため、最初にビデオ ストリームが属する PID を特定します (PAT と PMT を解析して)。次に、適応フィールドで「ランダム アクセス インジケーター」ビットを探して、キーフレームを見つけます。

uint8_t *pkt = <your 188 byte TS packet>;
assert( 0x47 == pkt[0] );
int16_t pid = ( ( pkt[1] & 0x1F) << 8 ) | pkt[2];
if ( pid == video_pid ) {
    // found video stream
    if( ( pkt[3] & 0x20 ) && ( pkt[4] > 0 ) ) {
        // have AF
        if ( pkt[5] & 0x40 ) {
          // found keyframe
} } }
于 2013-09-11T18:28:51.723 に答える
-1

H.264 を使用している場合は、I および P フレームに特定のバイト ストリームが存在する必要があります。I フレームの場合は 0x0000000165、P フレームの場合は 0x00000001XX のように、I を識別できるように、連続したバイト ストリームを解析して検索します。またはPフレーム..再び上記のバイトストリームはコーデックの実装に依存します..詳細については、FFMPEGを調べることができます..

于 2014-12-09T06:24:21.507 に答える