Как определить размеры видео файла потока программы mpeg-2

Как программно узнать ширину и высоту видео в файле потока программы mpeg-2 transport?

Редактировать: я использую С++, но рад примерам на любом языке. Изменить: исправлен вопрос - вероятно, я спрашивал о программных потоках.


person hamishmcn    schedule 13.11.2008    source источник


Ответы (4)


Ознакомьтесь с исходным кодом libmpeg2, декодера F/OSS MPEG2. Похоже, что ширина и высота задаются в функции mpeg2_header_sequence() в header.c. Однако я не уверен, как управление переходит к этой конкретной функции. Я бы предложил открыть файл MPEG2 в чем-нибудь с помощью libmpeg2 (например, MPlayer) и подключить отладчик, чтобы увидеть более точно, что он делает.

person Adam Rosenfield    schedule 13.11.2008

Если вы используете DirectX, в интерфейсе VMRWindowlessControl есть метод:

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

Или интерфейс IBasicVideo:

pivb->GetVideoSize(&w, &h);
person Community    schedule 13.11.2008

для видео 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--;
    }
person Andrew    schedule 16.11.2009

Хэмишман сказал, что ответ Адама Розенфилда был тем, что ему было нужно. Это заставляет меня задаться вопросом о точности вопроса. Транспортный поток MPEG не имеет заголовок видеоряда. Этот заголовок находится в программном потоке MPEG.

У меня нет ответа. Я просто надеялся вопреки надежде, что чей-то ответ был правильным, потому что он мне нужен.

person Dodger    schedule 20.07.2011
comment
Привет @Dodger - я уже не помню, но подозреваю, что ты прав - я, вероятно, работал с программными потоками (я исправил вопрос) - person hamishmcn; 21.07.2011
comment
Заголовок видеопоследовательности является частью потока ES. Поскольку транспортный поток содержит PES и, следовательно, ES, имеется также заголовок видеопоследовательности. - person DarkDust; 17.07.2013