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

StackOverflow https://stackoverflow.com/questions/287053

Вопрос

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

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

Это было полезно?

Решение

Посмотрите исходный код для 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 по горизонтали & amp; вертикальный размер можно найти в заголовке последовательности видео (из потока битов видео). Код заголовка последовательности - 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-2, другой - RFC для передачи MPEG через RTP.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top