Stellen Sie sich vor, ich habe H.264 AnxB-Frames, die von einer Echtzeitkonversation kommen. Was ist die beste Möglichkeit, MPEG2-Transportstreams zu kapseln, während die Timing-Informationen für die nachfolgende Wiedergabe beibehalten werden?Einkapseln von H.264-Streams Variable Framerate im MPEG2-Transportstream
Ich verwende libavcodec und libavformat Bibliotheken. Wenn ich einen Zeiger auf ein Objekt (* pcc) vom Typ AVCodecContext erhalte, setze ich den folgenden Wert.
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;
Als ich NAL-Einheiten erhalten, erstelle ich eine AVPacket und rufen 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);
ich zwei Fragen im Grunde haben:
1) Für eine variable Framerate, ist es eine Möglichkeit, nicht die folg angeben. pcc-> time_base.num = 1; pcc-> time_base.den = fps; und ersetzen Sie es durch etwas, um variable Framerate anzuzeigen?
2) Welche "Zeitstempel" sollte ich beim Senden von Paketen pkt.dts und pkt.pts zuweisen?
Im Moment, wenn ich die Ausgabe mit ffplay spiele, spielt es mit konstanter Framerate (fps), die ich im obigen Code verwende.
Ich würde auch gerne wissen, wie man unterschiedliche räumliche Auflösung unterbringen kann. In dem Stream, den ich erhalte, geht jedem Keyframe SPS und PPS voraus. Ich weiß, wann sich die räumliche Auflösung ändert. IS gibt es eine Möglichkeit, pcc-> width = 640; pcc-> Höhe = 480; im Voraus? Mit anderen Worten, geben Sie an, dass sich die räumliche Auflösung im Midstream ändern kann.
Vielen Dank, Eddie