我正在开发一个 libavformat API 包装器,它将带有 H.264 和 AAC 的 MP4 文件转换为适合流式传输的 MPEG-TS 段。我只是在没有重新编码的情况下进行简单的流复制,但是我生成的文件以3600 fps而不是 24 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