Как программно узнать ширину и высоту видео в файле потока программы mpeg-2 transport?
Редактировать: я использую С++, но рад примерам на любом языке. Изменить: исправлен вопрос - вероятно, я спрашивал о программных потоках.
Как программно узнать ширину и высоту видео в файле потока программы mpeg-2 transport?
Редактировать: я использую С++, но рад примерам на любом языке. Изменить: исправлен вопрос - вероятно, я спрашивал о программных потоках.
Ознакомьтесь с исходным кодом libmpeg2, декодера F/OSS MPEG2. Похоже, что ширина и высота задаются в функции mpeg2_header_sequence()
в header.c
. Однако я не уверен, как управление переходит к этой конкретной функции. Я бы предложил открыть файл MPEG2 в чем-нибудь с помощью libmpeg2 (например, 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 не имеет заголовок видеоряда. Этот заголовок находится в программном потоке MPEG.
У меня нет ответа. Я просто надеялся вопреки надежде, что чей-то ответ был правильным, потому что он мне нужен.