Прямая трансляция контента с использованием 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 в конвейер.

  1. Может ли MP4Box получать входные данные из источника, который не является файлом?
  2. Может ли MP4Box постепенно извлекать такой контент (из файла или другого источника), пока он поступает в режиме реального времени? т.е. немного подождать, если поток остановится на 1 секунду и возобновится автоматически.
  3. Тот же вопрос, но для вывода: может ли он выводить что-то, что не является файлом (например, 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. Это все еще очень "альфа", но он должен быть легко адаптируем для простых случаев использования.

Другие вопросы по тегам