У меня есть задача построить декодер, который генерирует ровно 1 необработанный аудиокадр для 1 необработанного видеокадра из закодированного сетевого потока mpegts, чтобы пользователи могли использовать API, вызывая getFrames (), и получать именно эти два кадра.
В настоящее время я читаю с av_read_frame в потоке, декодирую по мере поступления пакетов, аудио или видео; собирать, пока видео пакет не будет достигнут. Проблема, как правило, в том, что перед просмотром видео принимается несколько аудиопакетов.
av_read_frame блокирует, возвращает, когда определенное количество аудиоданных собрано (1152 выборок для mp2); и декодирование этого пакета дает необработанный AVFrame, имеющий длительность T (зависит от частоты дискретизации); в то время как видеокадр обычно имеет длительность больше T (зависит от fps), поэтому перед ним принимается несколько аудиокадров.
Я догадывался, что мне нужно найти способ объединить собранные звуковые кадры в один единственный кадр, как только начинается видео. Кроме того, я полагаю, что необходима повторная выборка и установка метки времени для выравнивания с видео. Я не знаю, если это даже верно, хотя.
Какой самый плавный способ синхронизации видео и аудио таким образом?
Задача ещё не решена.
Других решений пока нет …