Настройка PTS при переключении между потоками

Моему приложению нужно переключаться между двумя (или более) потоками на входе, в то время как на выходе есть только один (вы можете думать о нем как о потоковом мультиплексоре). Кадры из ввода декодируются, а затем снова перекодируются из-за наложения.

Итак, чтобы упорядочить AVFrame PTS, я вычисляю интервал перед кодированием кадров. Но дело в том, что когда я переключаюсь между потоком RTMP и файлом MP4, видео немного задерживается каждый раз, когда я переключаюсь. Итак, на третьем переключении результирующий поток рассинхронизирован.

Я не знаю, упустил ли я что-то, что нужно изменить в кадре перед кодированием. Я тоже думал про создание независимого ПТС для кадров на выходе но не знаю как его создать.

Входные потоки могут иметь разные FPS, временные развертки или кодеки, и приложение должно иметь возможность работать со всеми ними.


person Ruben Sanchez Castellano    schedule 05.09.2017    source источник


Ответы (1)


Я обнаружил первопричину.

Проблема была в файле MP4. С этим типом файла (по какой-то причине) видео- и аудиопакеты считываются пакетами ошибок (т. Е.: 20 видеопакетов, а затем 20 аудиопакетов), в то время как в потоке RTMP это больше похоже на (2 видео, а затем 2 аудиопакеты). Таким образом, проблема заключалась в том, что переключатель применялся до чтения всей группы (т. е.: 20 видеопакетов и 10 аудиопакетов), поэтому после этого момента результирующий поток не синхронизирован, независимо от того, что вы делаете после этого. .

Решение, которое я реализовал, ждет, пока тип декодированного кадра не будет отличаться от предыдущего. Тогда, когда я выполняю переключатель.

person Ruben Sanchez Castellano    schedule 05.09.2017
comment
Поскольку я хочу сделать то же самое (переключение входа в реальном времени с помощью mp4), не могли бы вы предоставить какой-нибудь код? Спасибо! - person user498529; 29.09.2018
comment
@ user498529 Просто проверьте тип кадра (AVMEDIA_TYPE_VIDEO или AVMEDIA_TYPE_AUDIO). Однако это не самое предпочтительное решение, поскольку связки могут содержать много содержимого. Лучшим решением будет буферизация содержимого, прочитанного из файла, в двух разных буферах и получение аудио/видеокадров по отметке времени. - person Ruben Sanchez Castellano; 06.11.2019