Wie man Video-Dimensionen einer MPEG-2-Programmstrom-Datei bestimmen
-
08-07-2019 - |
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
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.
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.