2013-09-27 21 views
5

Ich arbeite an einem libavformat-Wrapper, der MP4-Dateien mit H.264 und AAC in MPEG-TS-Segmente konvertiert, die für Streaming geeignet sind. Ich mache nur eine einfache Stream-Kopie ohne Neucodierung, aber die Dateien, die ich produziere, spielen das Video wieder unter 3600 fps anstelle von 24 fps.Mit FFmpegs libavformat-API erstellte Dateien werden mit 3600 fps zu schnell wiedergegeben.

Hier sind einige Ausgaben von ffprobe https://gist.github.com/chrisballinger/6733678 ist die defekte Datei unter:

r_frame_rate=1/1 
avg_frame_rate=0/0 
time_base=1/90000 
start_pts=0 
start_time=0.000000 
duration_ts=2999 
duration=0.033322 

Die gleiche Eingabedatei manuell durch ffmpeg hat Informationen richtigen Zeitstempel gesendet:

r_frame_rate=24/1 
avg_frame_rate=0/0 
time_base=1/90000 
start_pts=126000 
start_time=1.400000 
duration_ts=449850 
duration=4.998333 

Ich glaube, das Problem liegt irgendwo in meinem Setup von libavformat hier: https://github.com/OpenWatch/FFmpegWrapper/blob/master/FFmpegWrapper/FFmpegWrapper.m#L349, wo ich eine Reihe von Code aus ffmpeg.c, die für die direkte Stream-Kopie benötigt wurde repurpurposed.

Da 3600 scheint wie eine "magische Zahl" (60 * 60), könnte es so einfach sein wie ich nicht die Zeitskala richtig einstellen, aber ich kann nicht herausfinden, wo mein Code von ffmpeg/avconv selbst.

ähnliche Frage hier, aber ich glaube nicht, dass sie so weit gekommen, wie ich tat: Muxing a H.264 Annex B & AAC stream using libavformat with vcopy/acopy

Antwort

1

Es dauerte eine Weile, aber das ist die Antwort: https://stackoverflow.com/a/16903982/805882

packet.pts = av_rescale_q(packet->pts, inStream->time_base, outStream->time_base); 
packet.dts = av_rescale_q(packet->dts, inStream->time_base, outStream->time_base); 
2

Eigentlich Ihre Punkte und dts sind vermasselt.

Die MP4-Datei hat pts und dts gemäß MP4-Zeitbasis und Sie übergeben die gleichen Punkte und dts zum ts muxer, der mit 90000Hz-Takt arbeitet. Wenn Ihre fps beispielsweise 30 Bilder pro Sekunde haben, bedeutet dies, dass in TS ein Videoframe bei allen 3000 Ticks angezeigt wird.

sollten Sie av_rescal_q verwenden, um die Punkte von MP4 zu ts Timbase zu ändern.

+0

Thank you! Ich war mir nicht ganz sicher, wie ich die Zeitbasis richtig skalieren sollte, aber es scheint, dass dies mir helfen könnte, mich in die richtige Richtung zu lenken. Ich werde dich wissen lassen, wie es läuft! –