Question

Comment savoir par programme la largeur et la hauteur de la vidéo dans un fichier de flux de programme mpeg-2 transport ?

Edit: J'utilise C ++, mais je suis heureux d'avoir des exemples dans n'importe quel langage. Edit: Question corrigée - c’était probablement pour les flux de programmes que je posais

Était-ce utile?

La solution

Consultez le code source pour libmpeg2 , un décodeur F / OSS MPEG2. Il semble que la largeur et la hauteur soient définies dans la fonction mpeg2_header_sequence () dans header.c . Je ne suis cependant pas sûr de savoir comment le contrôle est appliqué à cette fonction particulière. Je suggérerais d'ouvrir un fichier MPEG2 dans quelque chose utilisant libmpeg2 (tel que MPlayer ) et de joindre un débogueur pour voir de plus près exactement ce qu'il fait.

Autres conseils

Si vous utilisez DirectX, il existe une méthode dans l'interface VMRWindowlessControl:

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

Ou l'interface IBasicVideo:

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

pour MPEG2 Video, l'horizontale & amp; la taille verticale peut être trouvée dans l'en-tête de séquence vidéo (à partir du flux de bits vidéo). Le code d'en-tête de séquence est 0x000001B3. Quelques exemples de code ci-dessous. Cependant, il ne prend pas en compte l'extension de taille horizontale / verticale si spécifié dans l'en-tête d'extension de séquence.

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

Vous n'avez pas indiqué la langue que vous souhaitez utiliser, je doute que vous obteniez des exemples de code.

Consultez les liens suivants. La première décrit le format de fichier MPEG-2, l’autre est le RFC sur le transport de MPEG via RTP.

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

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

Hamishmcn a déclaré que la réponse d’Adam Rosenfield était ce dont il avait besoin. Cela me fait me poser des questions sur l'exactitude de la question. Un flux de transport MPEG n'a pas d'en-tête de séquence vidéo. Cet en-tête se trouve dans un flux de programme MPEG.

Je n'ai pas de réponse. J'espérais juste contre l'espoir que la réponse de quelqu'un soit correcte, car j'en ai besoin d'une.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top