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

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

有帮助吗?

解决方案

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

其他提示

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

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

或IBasicVideo界面:

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

用于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--;
    }

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

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

http:// www .fh-friedberg.de / fachbereiche / E2 /电信劳动/津凯/ MK / mpeg2beg / beginnzi.htm

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top