Domanda

Come posso scoprire a livello di programmazione la larghezza e l'altezza del video in un file di flusso di programma mpeg-2 transport ?

Modifica: sto usando C ++, ma sono felice per esempi in qualsiasi lingua. Modifica: domanda corretta - probabilmente stavo chiedendo stream del programma

È stato utile?

Soluzione

Controlla il codice sorgente su libmpeg2 , un decodificatore MPEG2 F / OSS. Sembra che la larghezza e l'altezza siano impostate nella funzione mpeg2_header_sequence () in header.c . Non sono sicuro di come il controllo fluisca a quella particolare funzione, però. Suggerirei di aprire un file MPEG2 in qualcosa usando libmpeg2 (come MPlayer ) e di allegare un debugger per vedere più da vicino esattamente cosa sta facendo.

Altri suggerimenti

Se si utilizza DirectX, esiste un metodo nell'interfaccia VMRWindowlessControl:

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

O l'interfaccia IBasicVideo:

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

per MPEG2 Video orizzontale & amp; la dimensione verticale si trova nell'intestazione della sequenza video (dal flusso di bit video). Il codice dell'intestazione della sequenza è 0x000001B3. Alcuni esempi di codice di seguito. Tuttavia, non tiene conto dell'estensione della dimensione orizzontale / verticale se specificato nell'intestazione dell'estensione della sequenza.

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

Non hai detto quale lingua vuoi usare, quindi dubito che otterrai esempi di codice.

Dai un'occhiata ai seguenti link. Il primo descrive il formato di file MPEG-2, l'altro è l'RFC sul trasporto di MPEG tramite RTP.

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

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

hamishmcn ha detto che la risposta di Adam Rosenfield era ciò di cui aveva bisogno. Questo mi fa meravigliare dell'accuratezza della domanda. Un flusso di trasporto MPEG non ha un'intestazione di sequenza video. Tale intestazione si trova in un flusso di programma MPEG.

Non ho una risposta. Speravo solo contro la speranza che la risposta di qualcuno fosse corretta, perché ne ho bisogno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top