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