Прямая трансляция через MP4

Я работаю над онлайн-сервисом телевидения. Одной из целей является воспроизведение видео без каких-либо дополнительных плагинов для браузера (кроме Flash).

Я решил использовать MP4, потому что он поддерживается большинством браузеров HTML5 и Flash (для резервирования). Видео транскодируются из ASF на сервере с помощью FFMpeg.

Однако я обнаружил, что MP4 нельзя транслировать в реальном времени, поскольку он имеет атом moov для метаданных, которые должны указывать длину. FFMpeg не может напрямую передавать mp4 на стандартный вывод, потому что он помещает moov в конец файла. ( Оперативное транскодирование и потоковая передача MP4 работает в Android, но не работает в проигрывателе Flash Player с ошибкой NetStream.Play.FileStructureInvalid)

Конечно, MPEG-TS существует, но он не поддерживается HTML5 <video>,

Я подумал о методе перекодировки потока в реальном времени в MP4, и при каждом новом HTTP-запросе сначала отправьте moov, который указывает очень длинное число для длины видео, а затем начните отправлять оставшуюся часть Файл MP4.

Можно ли использовать MP4 для потоковой передачи таким образом?

После некоторых исследований и ответа av501 я понимаю, что размеры кадров должны быть известны, чтобы они могли работать.

Можно ли сегментировать файл mp4 на более мелкие части, чтобы его можно было транслировать?

Конечно, переключение на другой контейнер / формат является опцией, но единственный формат, совместимый как с Flash, так и с HTML5, это mp4/h264, поэтому, если мне придется поддерживать оба, мне придется дважды перекодировать.

4 ответа

Решение

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

AvAssetWriter только кодирует в файл, кажется, нет способа получить закодированное видео в память. Чтение файла во время его записи из фонового потока, чтобы сказать, что сокет приводит к элементарному потоку, это по сути m4v, который является контейнером с h264/acc mdata, но без атомов moov. (другими словами, без заголовка) Ни один из проигрывателей Apple не может воспроизводить этот поток, но модифицированный проигрыватель, основанный на ffplay, должен иметь возможность декодировать и воспроизводить поток. Это должно работать, потому что ffplay использует libavformat, которая может декодировать элементарные потоки, одно предостережение, так как нет информации о длине файла, некоторые вещи должны быть определены при воспроизведении, DTS и PTS, а также проигрыватель не может искать в файле.

В качестве альтернативы, для создания потока rtmp можно использовать необработанные значения NaUL из потока m4v.

Если вы хотите обсудить дальше, вы можете связаться со мной напрямую.

Как вы получите данные.

Поскольку вам все равно придется перестраивать файл на принимающей стороне, я думаю, вы могли бы просто его сегментировать, Стив Макфарин написал небольшой appleSegmentedEcorder, который вы можете найти на его странице github, это решает некоторые проблемы с атомами moov, так как вы есть вся информация о файле.

Вы можете использовать фрагментированный MP4. Фрагментированный файл MP4 построен следующим образом:

moov [moof mdat]+

В этом случае поле moov содержит только основную информацию о дорожках (сколько, их тип, инициализация кодека и т. Д.), Но не содержит информации о сэмплах в дорожке. Информация о местах и ​​размерах образцов находится в блоке moof, за каждым блоком moof следует mdat, содержащий образцы, как описано в предыдущем блоке moof. Как правило, можно выбрать длину пары (moof, mdat), равную 2,4 или 8 секундам (спецификации на это нет, но эти значения кажутся разумными для большинства случаев использования).

Это способ создать бесконечный поток MP4.

Нет, это не просто очень длинная длина... вам нужно знать точный размер каждого кадра, чтобы создать заголовок в mp4. [именно поэтому он создается в конце различными кодировщиками].

Просто взглянув на второй пункт вашего вопроса ("Видео транскодируются с ASF на сервере с помощью ffmpeg."), Вы упомянули, что вы используете ffmpeg для перекодирования видео на сервере.

Используйте qt-faststart или MP4Box, чтобы поместить атом MOOV в начало файла. (также убедитесь, что вы используете кодек H264 Video & AAC Audio для универсальной поддержки)

Надеюсь, это помогло вам.

MP4 - это формат файлов, разработанный MPEG (группа экспертов по движущимся изображениям). Это было создано для Международной организации по стандартизации и было сделано на основе QTFF. Во время первоначального выпуска MP4 был очень похож на QTFF. Тем не менее, он разработал и стал более продвинутым форматом файлового контейнера. MP4 может использоваться на устройствах Apple как для iOS, так и для macOS без необходимости перекодирования всего видео. Указанный формат файла имеет большое преимущество перед QTFF; он может передаваться по сети, а последний - нет. Формат файла MP4 поддерживается большинством операционных систем и инструментов для редактирования видео. Для файла, содержащего как видео, так и аудио, обычно используется расширение.MP4. Однако аудиофайлы используют только расширение.M4A. Аудиокниги используют расширение.M4B, позволяющее создавать закладки для аудио-файла из-за изменения кода. Расширение.M4V используется для необработанных видеопотоков MPEG4, в то время как мобильные телефоны обычно используют расширение.3G2 и.3GP. https://www.dumpmedia.com/video-converter/ - лучший конвертер, который я когда-либо использовал. Он может поддерживать многие форматы видеофайлов, такие как MP4, MOV, WMV, AVI, MKV, FLV, 3GP, MPEG и другие обычные форматы видео, есть простое руководство о том, как конвертировать MP4 в AVI, вы можете нажать его Узнать больше!

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