Исправление ключевых кадров видеоконтейнера для прямой трансляции

Исправление ключевых кадров видеоконтейнера для прямой трансляции

у меня естькарта захватачто обрабатываетсяпрограммакоторый я собираюсь запустить в Raspberry Pi 3 (я скомпилировал для него) для потоковой передачи видео локально на Chromecast. Эта программа запускается и выдает видеоданные на stdout в контейнере MPEG-TS с кодеками H.264 и AAC.

Я написал скрипт, который по сути сегментирует это для обслуживания потока HLS/m3u8:

./HDPVR2-testApp | ffmpeg -i - -c copy -f hls -hls_time 2 -hls_flags +delete_segments -hls_list_size 3 -hls_segment_filename /tmp/stream/file_%v_%03d.ts /tmp/stream/out.m3u8

Это работает хорошо практически на любом видеоплеере, за исключением Chrome(cast), который отказывается воспроизводить поток. CORS настроен правильно.

При отладке chrome://media-internalsпостоянно появляется следующее сообщение:

Метаданные контейнера ISO-BMFF для видеокадра указывают, что кадр является ключевым, но содержимое видеокадра указывает на обратное.

Исследуя этот вопрос более подробно, я пришел к выводу, чтоChrome более строг к воспроизведению видеоформатов.

Следуяэтот ответ, извлечение потока H.264 и повторное муксирование в файл решили проблему, заставив и Chrome, и Chromecast с удовольствием воспроизводить поток. Я протестировал его с помощью конвейера ( cat fixed-recording.mp4 | ffmpeg -i - ...), просто чтобы убедиться, что это не проблема.

Есть ли способ исправить ключевые кадры контейнера с помощью ffmpeg на лету? Мне нужно запустить это в RPi 3, что означает, что я не смогу перекодировать видео, и я бы предпочел не записывать на диск большие файлы. Вот что я попробовал:

  • Использование -movflags empty_moov+default_base_moof+frag_keyframeи их сочетание (из StackOverflow).
  • Вместо этого используется фрагментированный поток MP4.
  • Извлечение необработанных потоков в два файла не удалось, поскольку оба файла необходимо записывать постоянно.

Связанный контент