Я хотел сделать основную c фрагментированную программу вещания mp4 с avformat libs и HTML5 видео и MSE.
Это прямой эфир, и я использую avformat для копирования h264 данные в mp4-фрагменты.
Вот мой базовый c рисунок клиентов, подключающихся к потоку:
Итак, со словами:
- C1J: Первый клиент присоединяется:
- Запускается процесс форматирования
- Ящики ftyp, moov, moof, mdat будут доставлены клиенту1
- ftyp и moov оба атома сохраняются для последующего повторного использования
- C2J: Второй клиент присоединяется (позднее):
- процесс avformat продолжается (потому что он все еще продолжается обслуживая блоки moof и mdat для Client1)
- ранее сохраненные блоки ftyp и moov будут в первую очередь поданы на Client2
- после обслуживания блоков ftyp и moov, Client2 присоединится к потоку при следующем moof box.
Я сохранил файл mp4 на диск от обоих клиентов.
Порядок атомов в обоих файлах выглядит хорошо: ftype, moov, moof, mdat, moof, mdat ...
Оба файла могут воспроизводиться медиаплеерами (например, VL C) а также непосредственно в браузерах (Opera).
Client1 может также воспроизводиться через MSE в браузере (Opera), но поток Client2 не отображается с MSE (Opera).
Нет ошибок при консоль JS и медиа-интерфейс выглядят также хорошо (по крайней мере, эквивалентно клиенту Client1).
Теперь я понял, что каждый блок moof содержит поле mfhd (заголовок) с полем sequenceNumber
.
Конечно, в первом окне moof Client1 этот порядковый номер равен 1
. Однако в первом присоединенном блоке moof клиента Client2 этот sequenceNumber всегда> = 1
(в моем случае это 16
).
Что нужно изменить в полях moof в Client2, чтобы иметь действительный fmp4 с начала?
Я думаю, что видео Opera 10 * не нравится, если sequenceNumber не начинается с 1, но должны быть другие требования для того, чтобы оно было действительным.