2013-09-27 11 views
5

Я работаю над оболочкой 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

ответ

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

На самом деле ваши очки и DTS перепутались.

Файл MP4 имеет pts и dts в соответствии с временными интервалами MP4, и вы передаете те же pts и dts в мультиплексор ts, который работает с тактами 90000 Гц. , например, если ваш fps равен 30 кадрам в секунду, а затем в ts это будет означать, что показ видеокадра на каждые 3000 тиков.

вы должны использовать av_rescal_q, чтобы изменить баллы с mp4 на ts timbase.

+0

Спасибо! Я не был уверен, как правильно масштабировать временную базу, но похоже, что это может помочь мне в правильном направлении. Я дам вам знать, как все идет! –