如何确定mpeg-2程序流文件的视频尺寸

时间:2008-11-13 14:23:47

标签: c++ video mpeg-2 transport-stream

如何在mpeg-2 transport 程序流文件中以编程方式查找视频的宽度和高度?

编辑:我正在使用C ++,但我很高兴使用任何语言的示例。 编辑:更正的问题 - 这可能是我询问的程序流

5 个答案:

答案 0 :(得分:3)

查看libmpeg2的源代码,这是一个F / OSS MPEG2解码器。似乎宽度和高度在mpeg2_header_sequence()中的header.c函数中设置。不过,我不确定控制是如何流向该特定功能的。我建议使用libmpeg2(例如MPlayer)打开一个MPEG2文件并附加一个调试器,以便更准确地查看它正在做什么。

答案 1 :(得分:1)

如果您使用的是DirectX,则VMRWindowlessControl界面中有一个方法:

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

或IBasicVideo界面:

pivb->GetVideoSize(&w, &h);

答案 2 :(得分: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--;
    }

答案 3 :(得分:0)

你还没说过你想用什么语言,所以我怀疑你会得到任何代码样本。

查看以下链接。第一个描述了MPEG-2文件格式,另一个是通过RTP传输MPEG的RFC。

http://www.fh-friedberg.de/fachbereiche/e2/telekom-labor/zinke/mk/mpeg2beg/beginnzi.htm

http://www.ietf.org/rfc/rfc2250.txt

答案 4 :(得分:0)

哈米什姆说,亚当罗森菲尔德的回答是他所需要的。这让我想知道问题的准确性。 MPEG传输流不 具有 视频序列标头。该标题位于MPEG节目流中。

我没有答案。我只是希望某人的回答是正确的,因为我需要一个。