Я работаю над оболочкой libavformat API, которая преобразует файлы MP4 с сегментами H.264 и AAC в MPEG-TS, подходящие для потоковой передачи. Я просто делаю простую копию потока без повторного кодирования, но файлы, которые я создаю, воспроизводят видео на 3600 fps вместо 24 кадров в секунду.Файлы, созданные с прямой копией потока с использованием API libavformat FFmpeg, слишком быстро работают со скоростью 3600 кадров в секунду.
Вот несколько выходов из 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
Спасибо! Я не был уверен, как правильно масштабировать временную базу, но похоже, что это может помочь мне в правильном направлении. Я дам вам знать, как все идет! –