Pergunta

Como faço para programaticamente descobrir a largura e altura do vídeo em MPEG-2 transportes arquivo de fluxo de programa?

Edit: eu estou usando C ++, mas estou feliz por exemplos em qualquer idioma. Edit: Corrigido questão - que era provavelmente programa de fluxos eu estava perguntando sobre

Foi útil?

Solução

Confira o código fonte para libmpeg2 , um decodificador F / OSS MPEG2. Parece que a largura e a altura são definidas em função da mpeg2_header_sequence() em header.c. Não tenho certeza como o controle flui para essa função específica, no entanto. Eu sugiro abrir um arquivo MPEG2 em algo usando libmpeg2 (como MPlayer ) e anexar um depurador para ver mais de perto exatamente o que está fazendo.

Outras dicas

Se você estiver usando DirectX, há um método na interface VMRWindowlessControl:

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

Ou a interface IBasicVideo:

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

para vídeo MPEG2 o tamanho horizontal e vertical pode ser encontrada na seqüência cabeçalho de vídeo (a partir do fluxo de bits de vídeo). O código de cabeçalho de sequência é 0x000001B3. Alguns códigos de exemplo a seguir. No entanto isso não leva em conta a extensão de tamanho horizontal / vertical, se especificada no cabeçalho de extensão sequência.

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

Você não disse o idioma que você quer usar, então eu duvido que você vai obter qualquer exemplos de código.

Tenha um olhar nos seguintes links. O primeiro descreve o formato de arquivo MPEG-2, a outra é a RFC no transporte MPEG via RTP.

http: // www .fh-friedberg.de / fachbereiche / e2 / Telekom-de-obra / Zinke / mk / mpeg2beg / beginnzi.htm

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

hamishmcn disse que a resposta de Adam Rosenfield era o que ele precisava. Isso me faz pensar sobre a precisão da questão. Um fluxo de transporte MPEG não Have um cabeçalho seqüência de vídeo. Esse cabeçalho é encontrado em um fluxo de programa MPEG.

Eu não tenho uma resposta. Eu só estava esperando contra a esperança de que a resposta de alguém estava correto, porque eu preciso de um.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top