Pregunta

¿Cómo averiguo programáticamente el ancho y la altura del video en un archivo de flujo de programa mpeg-2 transport ?

Editar: estoy usando C ++, pero estoy contento con los ejemplos en cualquier lenguaje. Editar: Pregunta corregida: probablemente era sobre las secuencias de programas sobre las que estaba preguntando

¿Fue útil?

Solución

Consulte el código fuente de libmpeg2 , un decodificador F / OSS MPEG2. Parece que el ancho y la altura se establecen en la función mpeg2_header_sequence () en header.c . Sin embargo, no estoy seguro de cómo fluye el control a esa función en particular. Sugeriría abrir un archivo MPEG2 en algo usando libmpeg2 (como MPlayer ) y adjuntar un depurador para ver más de cerca exactamente lo que está haciendo.

Otros consejos

Si está utilizando DirectX, hay un método en la interfaz VMRWindowlessControl:

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

O la interfaz IBasicVideo:

pivb->GetVideoSize(&w, &h);

para video MPEG2 horizontal & amp; El tamaño vertical se puede encontrar en el Encabezado de secuencia de video (del flujo de bits de video). El código del encabezado de secuencia es 0x000001B3. Algún código de ejemplo a continuación. Sin embargo, no tiene en cuenta la extensión de tamaño horizontal / vertical si se especifica en el encabezado de extensión de secuencia.

#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--;
    }

No ha dicho qué idioma quiere usar, así que dudo que obtenga muestras de código.

Echa un vistazo a los siguientes enlaces. El primero describe el formato de archivo MPEG-2, el otro es el RFC sobre el transporte de MPEG a través de RTP.

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

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

hamishmcn dijo que la respuesta de Adam Rosenfield era lo que necesitaba. Esto me hace preguntarme sobre la precisión de la pregunta. Un flujo de transporte MPEG no tiene un encabezado de secuencia de video. Ese encabezado se encuentra en una secuencia de programa MPEG.

No tengo una respuesta. Solo esperaba contra toda esperanza que la respuesta de alguien fuera correcta, porque necesito una.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top