Фрагментированная трансляция mp4 с авформатом - PullRequest
0 голосов
/ 06 марта 2020

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

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

avformat_write_header
while (!end) {
  av_read_frame
  av_write_frame
}
avformat_write_tailer

I иметь в качестве выходных флагов: 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 не один раз в начале?)

Спасибо

1 Ответ

0 голосов
/ 06 марта 2020

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

...