у меня естькарта захватачто обрабатываетсяпрограммакоторый я собираюсь запустить в 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.
- Извлечение необработанных потоков в два файла не удалось, поскольку оба файла необходимо записывать постоянно.