2013-09-27 18 views
5

我正在研究一種將H.264和AAC格式的MP4文件轉換爲適合流式處理的MPEG-TS段的libavformat API包裝器。我只是在不進行重新編碼的情況下進行簡單的流式複製,但我生成的文件播放視頻的速度爲3600 fps而不是24 fps。使用FFmpeg的libavformat API直接流副本創建的文件在3600 fps下回放速度太快

以下是ffprobe https://gist.github.com/chrisballinger/6733678一些輸出,碎文件如下:

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 

通過的ffmpeg手動發送相同的輸入文件具有正確的時間戳信息:

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 

我認爲問題的關鍵在於在我的libavformat設置中的某處:https://github.com/OpenWatch/FFmpegWrapper/blob/master/FFmpegWrapper/FFmpegWrapper.m#L349其中我重新使用了ffmpeg.c中直接流複製所需的一堆代碼。因爲3600看起來像是一個「幻數」(60 * 60),它可能就像我沒有正確設置時間尺度一樣簡單,但我無法弄清楚我的代碼與ffmpeg/avconv本身分離的位置。

類似的問題在這裏,但我不覺得像我一樣,他們得到儘可能:Muxing a H.264 Annex B & AAC stream using libavformat with vcopy/acopy

回答

1

過了一段時間,但是這就是答案: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

其實你的PTS和DTS都搞砸了。

根據MP4時基,MP4文件具有pts和dts,並且您將相同的pts和dts傳遞到與90000Hz時鐘配合使用的ts muxer。例如,如果您的fps是每秒30幀,那麼在ts中,這意味着每3000個刻度顯示一個視頻幀。

您應該使用av_rescal_q將pts從mp4更改爲ts timbase。

+0

謝謝!我不太清楚如何正確地重新調整時間基準,但看起來這可能會幫助我指出正確的方向。我會讓你知道它是怎麼回事! –