2012-04-04 15 views
5

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

Antwort

0

DTS und PTS werden in einem 90-kHz-Takt gemessen. Siehe ISO 13818 Teil 1 Abschnitt 2.4.3.6 weit unterhalb der Syntaxtabelle.

Wie für die variable Bildrate kann Ihr Framework eine Möglichkeit haben, dies zu generieren oder nicht (vui_parameters.fixed_frame_rate_flag = 0). Ob die Wiedergabesoftware es handhabt, ist eine völlig andere Frage. Die meisten Spieler gehen von einer festen Bildrate unabhängig von PTS oder DTS aus. mplayer kann die Bildrate für einen von ffmpeg erzeugten Transportstrom mit fester Rate nicht korrekt berechnen.

Ich denke, wenn Sie die Auflösung ändern möchten, müssen Sie den Stream (nal_unit_type 10 oder 11) beenden und eine neue Sequenz starten. Es kann sich im selben Transportstrom befinden (vorausgesetzt, Ihr Client ist nicht zu einfach).