Файлы, созданные с помощью прямого потокового копирования с использованием API FFmpeg libavformat, воспроизводятся слишком быстро со скоростью 3600 кадров в секунду.

Я работаю над оболочкой API libavformat, которая преобразует файлы MP4 с H.264 и AAC в сегменты MPEG-TS, подходящие для потоковой передачи. Я просто делаю простое потоковое копирование без перекодирования, но файлы, которые я создаю, воспроизводят видео со скоростью 3600 кадров в секунду вместо 24 кадров в секунду.

Вот некоторые результаты 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.

Аналогичный вопрос здесь, но я не думаю, что они дошли так далеко, как я: -libavformat-with-vcopy-acopy">Мультиплексирование потока H.264 Annex B и AAC с использованием libavformat с vcopy/acopy


person Chris Ballinger    schedule 27.09.2013    source источник


Ответы (2)


На самом деле ваши pts и dts перепутаны.

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

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

person Harit Vishwakarma    schedule 01.10.2013
comment
Спасибо! Я не был совсем уверен, как правильно изменить масштаб временной базы, но похоже, что это может помочь мне указать правильное направление. Я дам вам знать, как это происходит! - person Chris Ballinger; 02.10.2013

Это заняло некоторое время, но это ответ: 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);
person Chris Ballinger    schedule 01.10.2013