如何在mpeg-2 transport 程序流文件中以编程方式查找视频的宽度和高度?
编辑:我正在使用C ++,但我很高兴使用任何语言的示例。 编辑:更正的问题 - 这可能是我询问的程序流
答案 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
答案 4 :(得分:0)
我没有答案。我只是希望某人的回答是正确的,因为我需要一个。