Прямая трансляция контента с использованием mp4box
Я пытаюсь транслировать контент H.264 в HTML5 с помощью API расширений источника мультимедиа.
Следующий метод работает довольно хорошо:
ffmpeg -i rtsp://10.50.1.29/media/video1 -vcodec copy -f mp4 -reset_timestamps 1 -movflags frag_keyframe+empty_moov -loglevel quiet out.mp4
а потом:mp4box -dash 1000 -frag 1000 -frag-rap out.mp4
Я могу взять выход MP4Box (out_dashinit.mp4
) и отправьте его через веб-сокеты, фрагмент за фрагментом, клиенту JavaScript, который передает его в API источника мультимедиа.
Тем не менее, это не очень хороший метод для живого контента.
То, что я пытаюсь сделать сейчас, - это создать один конвейер, чтобы сделать это в реальном времени и с минимально возможной задержкой. С FFmpeg можно перенаправить вывод на stdout
вместо out.mp4
и захватить содержимое. Я не мог понять, возможно ли объединить MP4Box в конвейер.
- Может ли MP4Box получать входные данные из источника, который не является файлом?
- Может ли MP4Box постепенно извлекать такой контент (из файла или другого источника), пока он поступает в режиме реального времени? т.е. немного подождать, если поток остановится на 1 секунду и возобновится автоматически.
- Тот же вопрос, но для вывода: может ли он выводить что-то, что не является файлом (например,
stdout
) и может ли он делать это постепенно, чтобы всякий раз, когда выходные данные были готовы, я мог взять их и передать их веб-клиенту, по сути создавая бесконечный пунктирный MP4.
2 ответа
Вам не нужен MP4Box для генерации требуемого вывода, но вам нужно будет самостоятельно разбивать содержимое на части для поиска блоков в сгенерированном файле.
В основном вы будете генерировать fMP4
с H264
и отправьте в браузер moov
поле для инициализации и тому moof+mdat
коробки для каждого фрагмента MP4, который вы генерируете. Вам придется кодировать проигрыватель в JavaScript, вы, вероятно, не сможете использовать стандартный проигрыватель DASH.
Чтобы сгенерировать правильный фрагментированный MP4, вам нужно передать его в ffmpeg: -movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof
,
Обязательно используйте последнюю доступную версию.
Насколько я понимаю, ваше решение заключается не в потоковой передаче, а в постепенной загрузке одного файла MP4. Я правильно понимаю?
Недавно я запустил проект RTP2DASH, чтобы осуществлять прямую потоковую передачу DASH из источника данных RTP. Это все еще очень "альфа", но он должен быть легко адаптируем для простых случаев использования.