3

mpeg-2トランスポートプログラム ストリーム ファイル内 のビデオの幅と高さをプログラムで調べるにはどうすればよいですか?

編集: 私は C++ を使用していますが、どの言語の例でも満足しています。編集:質問を修正しました-おそらく私が尋ねていたのはプログラムストリームでした

4

4 に答える 4

3

F/OSS MPEG2 デコーダであるlibmpeg2のソース コードを確認してください。mpeg2_header_sequence()の関数で幅と高さが設定されているようですheader.c。ただし、その特定の機能に制御がどのように流れるかはわかりません。libmpeg2 ( MPlayerなど) を使用して MPEG2 ファイルを開き、デバッガーを接続して、それが何をしているかをより正確に確認することをお勧めします。

于 2008-11-13T16:37:18.767 に答える
1

MPEG2 ビデオの場合、水平方向と垂直方向のサイズはビデオ シーケンス ヘッダー (ビデオ ビット ストリームから) で確認できます。シーケンス ヘッダー コードは 0x000001B3 です。以下のサンプルコード。ただし、シーケンス拡張ヘッダーで指定されている場合、水平/垂直のサイズ拡張は考慮されません。

#define VIDEO_SEQUENCE_HDR  0xB3
#define HOR_SIZE_MASK       0xFFF00000
#define HOR_SIZE_SHIFT      20
#define VER_SIZE_MASK       0x000FFF00
#define VER_SIZE_SHIFT      8

unsigned char *pTmp = tsPacket;
int len = 188;
int horizontal, vertical;

 while(len>0 && !horizontal && !vertical)
 {        
        if(*pTmp == 0 && *(pTmp+1) == 0
           && *(pTmp+2)== 0x01 && *(pTmp+3) == 0xB3 && (len-1) >0)
        {
            unsigned int *pHdr = (unsigned int *)pTmp;    
            pHdr++ ; 
            unsigned int secondByte = ntohl(*pHdr);
            horizontal = (secondByte & HOR_SIZE_MASK) >> HOR_SIZE_SHIFT;
            vertical = (secondByte & VER_SIZE_MASK) >> VER_SIZE_SHIFT;           
            break;
        }
        pTmp++;
        len--;
    }
于 2009-11-16T17:45:38.637 に答える
1

DirectX を使用している場合は、VMRWindowlessControl インターフェイスに次のメソッドがあります。

piwc->GetNativeVideoSize(&w, &h, NULL, NULL);

または IBasicVideo インターフェイス:

pivb->GetVideoSize(&w, &h);
于 2008-11-13T16:47:12.460 に答える
0

hamishmcn は、Adam Rosenfield の答えが彼が必要としていたものであると述べました。これは、質問の正確性について疑問に思います。MPEG トランスポート ストリームには、ビデオ シーケンス ヘッダーありません。そのヘッダーは、MPEG プログラム ストリーム内にあります。

答えがありません。私は誰かの答えが正しいという希望に逆らって望んでいました。

于 2011-07-20T15:37:12.400 に答える