2012-04-04 1 views
5

Imaginez que j'ai des trames AnxB H.264 venant d'une conversation en temps réel. Quel est le meilleur moyen d'encapsuler dans le flux de transport MPEG2 tout en conservant les informations de synchronisation pour une lecture ultérieure? J'utilise les librairies libavcodec et libavformat. Quand j'obtiens un pointeur vers un objet (* pcc) de type AVCodecContext, je mets le foll.Encapsulation des flux H.264 à fréquence variable dans le flux de transport MPEG2

pcc->codec_id = CODEC_ID_H264; 
pcc->bit_rate = br; 
pcc->width = 640; 
pcc->height = 480; 
pcc->time_base.num = 1; 
pcc->time_base.den = fps; 

Quand je reçois des unités NAL, je crée un AVPacket et appelle av_interleaved_write_frame().

AVPacket pkt; 
av_init_packet(&pkt); 
pkt.flags |= AV_PKT_FLAG_KEY; 
pkt.stream_index = pst->index; 
pkt.data = (uint8_t*)p_NALunit; 
pkt.size = len; 

pkt.dts = AV_NOPTS_VALUE; 
pkt.pts = AV_NOPTS_VALUE; 

av_interleaved_write_frame(fc, &pkt); 

J'ai essentiellement deux questions:

1) Pour framerate variable est-il un moyen de ne pas préciser le Foll. pcc-> time_base.num = 1; pcc-> time_base.den = fps; et le remplacer par quelque chose pour indiquer le framerate variable?

2) Lors de la soumission de paquets, quels "horodatages" dois-je attribuer à pkt.dts et pkt.pts? En ce moment, quand je joue la sortie en utilisant ffplay, elle joue à un taux de rafraîchissement constant (fps) que j'utilise dans le code ci-dessus. Je voudrais aussi savoir comment adapter la résolution spatiale variable. Dans le flux que je reçois, chaque image clé est précédée de SPS et de PPS. Je sais à chaque fois que la résolution spatiale change. Y at-il un moyen de ne pas avoir à spécifier pcc-> width = 640; pcc-> hauteur = 480; upfront? En d'autres termes, indiquez que la résolution spatiale peut changer à mi-parcours.

Merci beaucoup, Eddie

Répondre

0

DTS et PTS sont mesurées dans une horloge de 90 kHz. Voir ISO 13818 partie 1 section 2.4.3.6 en dessous du tableau de syntaxe. En ce qui concerne la fréquence d'images variable, votre framework peut ou non avoir un moyen de générer ceci (vui_parameters.fixed_frame_rate_flag = 0). Que le logiciel de lecture le gère est une question ENTIÈREMENT différente. La plupart des joueurs assument un taux de trame fixe indépendamment de PTS ou DTS. mplayer ne peut même pas calculer correctement la fréquence d'images pour un flux de transport à débit fixe généré par ffmpeg.

Je pense que si vous voulez changer la résolution, vous devez terminer le flux (nal_unit_type 10 ou 11) et lancer une nouvelle séquence. Il peut être dans le même flux de transport (en supposant que votre client n'est pas trop simple).

Questions connexes