Frage

Wie finde ich heraus programmatisch die Breite und Höhe des Videos in einem MPEG-2 Transport Programm-Stream-Datei?

Edit: Ich bin mit C ++, aber ich bin für die Beispiele in jeder Sprache glücklich. Edit: Korrigierte Frage - es war wahrscheinlich Programmströme ich fragte nach

War es hilfreich?

Lösung

den Quellcode Schauen Sie sich an libmpeg2 , einem F / OSS-MPEG2-Decoder. Es scheint, dass die Breite und die Höhe in der mpeg2_header_sequence() Funktion in header.c eingestellt sind. Ich bin nicht sicher, wie die Steuerung fließt auf diese bestimmte Funktion, though. Ich würde die Öffnung eine MPEG2-Datei in etwas mit libmpeg2 (wie MPlayer ) und das Anbringen eines Debuggers vorschlagen zu sehen genauer genau das, was er tut.

Andere Tipps

Wenn Sie DirectX verwenden, gibt es ein Verfahren, bei dem VMRWindowlessControl Schnittstelle:

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

oder die IBasicVideo Schnittstelle:

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

für MPEG2 Video der horizontale und vertikale Größe kann in der Videosequenz Header (aus dem Video-Bitstrom) zu finden. Die Sequenz-Header-Code ist 0x000001B3. Einige Beispiel-Code unten. Allerdings ist es nicht berücksichtigt die horizontale / vertikale Größe Verlängerung, wenn in Folge Erweiterungs-Header angegeben.

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

Sie haben nicht gesagt, welche Sprache Sie verwenden möchten, so bezweifle ich, Sie Codebeispiele erhalten werden.

Haben Sie einen Blick auf die folgenden Links. Die erste beschreibt das MPEG-2-Format, die andere die RFC sind MPEG über RTP auf dem Transport.

http: // www .fh-friedberg.de / Fachbereiche / e2 / telekom-Arbeit / Zinke / mk / mpeg2beg / beginnzi.htm

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

hamishmcn sagte, dass Adam Rosenfield Antwort war, was er brauchte. Das macht mich über die Genauigkeit der Frage wundern. Ein MPEG-Transportstrom nicht wurde , um eine Videosequenz-Header. Das Header in einem MPEG-Programmstrom gefunden.

Ich habe keine Antwort. Ich habe nur gehofft, gegen die Hoffnung, dass jemand die Antwort richtig war, weil ich einen braucht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top