Как определить размеры видео файла потока программы MPEG-2 - PullRequest
3 голосов
/ 13 ноября 2008

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

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

Ответы [ 5 ]

3 голосов
/ 13 ноября 2008

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

1 голос
/ 16 ноября 2009

для видео 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--;
    }
1 голос
/ 13 ноября 2008

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

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

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

pivb->GetVideoSize(&w, &h);
0 голосов
/ 20 июля 2011

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

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

0 голосов
/ 13 ноября 2008

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

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

http://www.fh -friedberg.de / fachbereiche / e2 / телеком труд / Zinke / мК / mpeg2beg / beginnzi.htm

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

...