如何以编程方式找出 mpeg-2传输程序流文件中视频的宽度和高度?
编辑:我正在使用 C++,但很高兴看到任何语言的示例。编辑:更正的问题 - 这可能是我要问的程序流
如何以编程方式找出 mpeg-2传输程序流文件中视频的宽度和高度?
编辑:我正在使用 C++,但很高兴看到任何语言的示例。编辑:更正的问题 - 这可能是我要问的程序流
如果你使用的是 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--;
}
hamishmcn 说,Adam Rosenfield 的回答正是他所需要的。这让我怀疑这个问题的准确性。MPEG 传输流没有视频序列标头。该标头可在 MPEG 程序流中找到。
我没有答案。我只是希望有人的答案是正确的,因为我需要一个。