2008-11-13 6 views
3

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

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

ответ

3

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

+0

Вот что мне нужно, спасибо! – hamishmcn 2008-11-13 16:54:46

0

Вы не сказали, на каком языке вы хотите использовать, поэтому я сомневаюсь, что вы получите образцы кода.

Посмотрите на следующие ссылки. Первый описывает формат файла MPEG-2, другой - RFC для транспортировки MPEG через RTP.

http://www.fh-friedberg.de/fachbereiche/e2/telekom-labor/zinke/mk/mpeg2beg/beginnzi.htm

http://www.ietf.org/rfc/rfc2250.txt

+0

Спасибо за ссылки, но они, похоже, не упоминают, как/где кодируются размеры изображения. Я использую C++, но я доволен примерами на любом языке – hamishmcn 2008-11-13 16:11:05

1

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

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

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

pivb->GetVideoSize(&w, &h); 
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--; 
    } 
+0

Хороший материал, спасибо Andrew – hamishmcn 2009-11-16 21:47:15

0

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

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

+0

Привет @Dodger - я больше не помню, но подозреваю, что вы правы - я, вероятно, работал с программными потоками (я исправил вопрос) – hamishmcn 2011-07-21 03:24:55