2013-09-27 5 views
5

Sto lavorando su un wrapper API libavformat che converte i file MP4 con H.264 e AAC in segmenti MPEG-TS adatti allo streaming. Sto semplicemente facendo una semplice copia in streaming senza ricodifica, ma i file che produco riproducono il video allo 3600 fps anziché 24 fps.I file creati con una copia di flusso diretto utilizzando l'API libavformat di FFmpeg riproducono troppo velocemente a 3600 fps

Ecco alcune uscite ffprobe https://gist.github.com/chrisballinger/6733678, il file rotto è qui sotto:

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 

Lo stesso file di input inviati manualmente tramite ffmpeg trovi corretta informazione timestamp:

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 

Credo le bugie problema da qualche parte nel mio setup di libavformat qui: https://github.com/OpenWatch/FFmpegWrapper/blob/master/FFmpegWrapper/FFmpegWrapper.m#L349 dove ho riproposto un mucchio di codice da ffmpeg.c che era necessario per la copia del flusso diretto.

Poiché 3600 sembra un "numero magico" (60 * 60), potrebbe essere semplice come me non impostare correttamente la scala temporale, ma non riesco a capire dove il mio codice diverge da ffmpeg/avconv stesso.

domanda simile qui, ma non credo che hanno ottenuto per quanto ho fatto: Muxing a H.264 Annex B & AAC stream using libavformat with vcopy/acopy

risposta

1

c'è voluto un po, ma questa è la risposta: 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

In realtà i vostri punti e DTS sono in disordine.

Il file MP4 ha pts e dts in base alla base dei tempi di MP4 e si stanno passando gli stessi pts e dts al ts muxer che funziona con l'orologio 90000Hz. ad esempio se il tuo fps è di 30 fotogrammi al secondo, quindi in ts vorrà dire che mostra un fotogramma video ogni 3000 tick.

dovresti usare av_rescal_q per cambiare i pts da mp4 a ts timbase.

+0

Grazie! Non ero abbastanza sicuro su come ridimensionare correttamente la base di tempo, ma sembra che questo potrebbe aiutare a indicarmi la giusta direzione. Ti farò sapere come va! –

Problemi correlati