3

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

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

4

4 回答 4

3

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

于 2008-11-13T16:37:18.767 回答
1

如果你使用的是 DirectX,在 VMRWindowlessControl 接口中有一个方法:

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

或者 IBasicVideo 接口:

pivb->GetVideoSize(&w, &h);
于 2008-11-13T16:47:12.460 回答
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 回答
0

hamishmcn 说,Adam Rosenfield 的回答正是他所需要的。这让我怀疑这个问题的准确性。MPEG 传输流没有视频序列标头。该标头可在 MPEG 程序流中找到。

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

于 2011-07-20T15:37:12.400 回答