Фрагментированная трансляция в формате mp4 с авформатом

Я хочу транслировать прямой эфир (h264 -> фрагментированный mp4) с avformatfunctions.

Теперь в основном у меня есть рабочий пример с этим псевдо:

avformat_write_header
while (!end) {
  av_read_frame
  av_write_frame
}
avformat_write_tailer

У меня это как флаги вывода: movflags +frag_keyframe+empty_moov+default_base_moof.

Я отправляю вывод в видео html5, которое воспроизводится нормально и плавно. Однако я хочу транслировать его, поэтому всякий раз, когда появляется новый игрок, я хочу передать ему те же данные:

avformat_write_header
while (!end) {
  av_read_frame
  av_write_frame (to multiple clients)
}
avformat_write_tailer

Однако первый клиент может воспроизводить поток, а остальные - нет.

Это потому, что структура fmp4: первый клиент получает правильные атомы ftyp и moov, тогда как остальные клиенты - нет.

Теперь я могу взломать свой код, чтобы предоставить более ранние атомы ftype и moov более поздним клиентам, но я думаю, что это неразумно - поправьте меня, если я ошибаюсь.

Мои вопросы:

  1. Как я могу попросить avformat во время потока (вычислить) и включить атомы ftyp и moov?
  2. Не испортит ли включение ftyp и moov во время стрима первого клиента? (Допустимо ли в fmp4 иметь ftype и moov не только один раз в начале?)

Спасибо


person Daniel    schedule 06.03.2020    source источник


Ответы (1)


Совместное использование ftyp и moov называется initialization fragment. Клиент должен сначала загрузить и обработать его, независимо от того, какой сегмент он намеревается воспроизвести следующим. Это не хакерство, это именно то, как должен работать fmp4.

person szatmary    schedule 06.03.2020