Оперативное транскодирование и потоковая передача MP4 работает в Android, но не работает в проигрывателе Flash Player с ошибкой NetStream.Play.FileStructureInvalid

Недавно у меня была задача использовать ffmpeg в качестве транскодирования, а также инструмента потоковой передачи. Задача состояла в том, чтобы преобразовать файл из данного формата в MP4 и немедленно передать его, захватывая его из stdout. Все идет нормально. Потоковая передача работает хорошо с родным плеером вкладок Android, а также проигрывателем VLC. Проблема с флеш плеером. Это дает следующую ошибку:

NetStream.Play.FileStructureInvalid: Adobe Flash не может импортировать файлы с недопустимыми структурами файлов.

Используемые флаги ffmpeg

$ ffmpeg -loglevel quiet -i somefile.avi -vbsf h264_mp4toannexb -vcodec libx264 \
-acodec aac -f MP4 -movflags frag_keyframe+empty_moov -re - 2>&1

1 ответ

Как отмечено в документах для -movflags

Muxer mov/mp4/ismv поддерживает фрагментацию. Как правило, файл MOV/MP4 содержит все метаданные обо всех пакетах, хранящихся в одном месте (записанные в конце файла, его можно переместить в начало для лучшего воспроизведения с помощью qt-faststart инструмент). Фрагментированный файл состоит из нескольких фрагментов, в которых пакеты и метаданные об этих пакетах хранятся вместе. Преимущество записи фрагментированного файла заключается в том, что файл можно декодировать даже в том случае, если запись прервана (в то время как обычное MOV/MP4 невозможно декодировать, если он не завершен должным образом), и требует меньше памяти при записи очень длинных файлов (поскольку запись обычного MOV Файлы / MP4 хранят информацию о каждом отдельном пакете в памяти, пока файл не будет закрыт). Недостатком является то, что он менее совместим с другими приложениями.

Либо переключитесь на флэш-плеер, который может обрабатывать фрагментированные файлы MP4, либо используйте другой формат контейнера, который лучше поддерживает потоковую передачу.

Также, -re является опцией только для ввода, поэтому было бы более разумно указывать ее перед вводом, а не перед выводом.

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