FFMPEG: преобразование mpegts в mp4 дает ошибку: мультиплексор не поддерживает вывод без поиска

При передаче mpegts в ffmpeg, который должен преобразовывать его в mp4 и передавать в стандартный вывод, ffmpeg говорит: «Мультиплексор не поддерживает вывод без поиска».

После долгих исследований я пришел к выводу, что mp4 — плохой выбор для такого перекодирования на лету из-за поиска. Итак, по сути: MP4 не может передаваться через ffmpeg, что имеет смысл.

Но у меня нет непрерывного потока mpegts, у меня есть куски по 5 секунд. Так что это действительно так:

  • Вот мой файл *.ts размером 1 мб
  • Пожалуйста, прочитайте это из канала, пока не нажмете EOF
  • Пожалуйста, трансмуксируйте его в mp4 (если вам действительно нужно искать, используйте буфер)
  • Пожалуйста, передайте полный внутренний буфер mp4 на стандартный вывод

Мне нужны эти фрагменты mp4 для HTML5 MediaSource, фрагментация не проблема, я использую mp4box.js, который работает как шарм.

Вопросы:

  • Может ли FFMPEG выполнять такую ​​внутреннюю буферизацию?
  • Есть ли лучший вариант для рассмотрения?

По сути: могу ли я (как-то) взаимодействовать с ffmpeg без использования файлов? Мои текущие решения работают с файлами и опрашивают новые фрагменты, что уродливо.

Если вас интересует моя команда ffmpeg, просто дайте мне знать.


person Kr0e    schedule 06.12.2015    source источник
comment
Мне просто нужен способ напрямую общаться с ffmpeg, например: вот мой входной буфер, и, пожалуйста, дайте выходной буфер без создания файлов. Поскольку моя программа вызывает ffmpeg как дочерний процесс, я не хочу тратить компьютер на файлы, которые используются только один раз для трансляции. Это действительно похоже на проблему интерфейса с ffmpeg. Действительно ли ffmpeg не может буферизовать вывод и отправлять его кусками вместо потоковой передачи по сегментам? Я не хочу идти до C только для того, чтобы изменить интерфейс...   -  person Kr0e    schedule 07.12.2015


Ответы (2)


Поскольку вы упомянули фрагментацию, вы можете просто включить ее с помощью movflags. Пример для фрагментов, начинающихся с каждого ключевого кадра:

ffmpeg -i segment.ts -c copy -movflags frag_keyframe+empty_moov -f mp4 -

Наличие пустого атома moov означает, что ему не нужно искать, и поэтому он работает с каналом.

person aergistal    schedule 07.12.2015
comment
Хотя это каким-то образом работает, это мешает вставке в MediaSource, поскольку продолжительность всегда будет равна 0, а последующие фрагменты не могут быть вставлены в ближайшее время. Весь этот материал с mp4 - большая заноза в заднице... MediaSource! Почему ты не поддерживаешь ТС!!! Другая возможность - использовать какой-то emscripten-скомпилированный ffmpeg, который имеет виртуальную файловую систему в памяти. Это в основном все, что я ищу ... способ сказать ffmpeg использовать что-то в ОЗУ, мне не нужны потоковые возможности ffmpeg, так как я действительно имею дело только с 5-секундными фрагментами, которые сами по себе не зависят от друг друга. - person Kr0e; 07.12.2015
comment
-copyts имеет значение? Вы можете использовать RAM-диск для второго решения. - person aergistal; 07.12.2015
comment
И MSE должен поддерживать MPEG-2 TS w3c.github.io/ media-source/byte-stream-format-registry.html - person aergistal; 07.12.2015
comment
Это правда. Но не сейчас, как я вижу. Возможно, в будущих выпусках. В настоящее время статус-кво всегда предполагает преобразование сегментов ts в mp4 прямо в браузере, но для этого трудно найти надежные библиотеки. Кроме того, в мобильных устройствах вы не хотите трансмуксировать вещи ... Слишком передовые по-прежнему - person Kr0e; 07.12.2015

Если вы можете жить без настоящего формата mp4, использование ismv на самом деле сработало для меня даже лучше (не повредило информацию о поиске и общей продолжительности в некоторых игроках), чем ручная настройка movflags. Согласно документации по форматам ffmpeg, формат ismv похож на mp4, но auto настраивает movflags для потоковой передачи и, на мой взгляд, делает это лучше.

Протестировано в: Firefox, Chrome, VLC

ffmpeg -i input.mp4 -f ismv -

К сожалению, ни эта команда, ни ответ aergistal не создают видео, совместимое для загрузки в твиттер по состоянию на 19/12/20 из-за видео в твиттере проверка загрузки очень строгая и требует того, что, как мне кажется, является наиболее распространенным из форматов mp4. Так что на данный момент мне все еще приходится использовать ffmpeg для вывода непосредственно в файл, а не stdout для загрузки видео в твиттер. Но я хотел бы услышать, если кто-нибудь нашел способ обойти это!

person Sharpiro    schedule 20.12.2019