Как определить размеры видео файла потока программы MPEG-2
-
08-07-2019 - |
Вопрос
Как программно определить ширину и высоту видео в файле программы потока Изменить: я использую 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.
Хэмишмчн сказал, что ответ Адама Розенфилда - то, что ему нужно. Это заставляет меня задуматься о точности вопроса. Транспортный поток MPEG не имеет заголовок видеопоследовательности. Этот заголовок находится в потоке программы MPEG.
У меня нет ответа. Я просто надеялся, что чей-то ответ был правильным, потому что он мне нужен.