1

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

  • Будет работать практически на всех ОС и дистрибутивах
  • Будет работать со старыми выпусками ffmpeg (debian squeeze по-прежнему использует ffmpeg 0.5.10)

Мой первый источник - файл FLV или mp4. Он содержит два потока: аудио и видео. Мне плевать на видео, оно не включено в окончательный файл.

Второй источник - список изображений PNG или JPG. Они будут использованы для создания видеопотока с использованием image2 .

На выходе должен быть файл с двумя потоками: аудио и видео. У меня нет строгих требований в отношении контейнера, аудиокодека и видеокодека. Они должны быть легко доступны только на любой ОС / устройстве. Я хочу максимально сохранить качество звука. Видеопоток представляет собой набор статических слайдов. Было бы здорово минимизировать размер выходного файла.

Согласно этому описанию, какие флаги / контейнеры / кодеки вы бы использовали?


Описание текущего процесса следующее:

  1. Извлечь звуковую дорожку из первого источника

    ffmpeg -v error -i source_1_path -vn -acodec libvorbis audio_track.ogg
    
  2. Создать окончательный файл

    ffmpeg -v error -f image2 -r 1 -i frame_pattern.jpg -i audio_track.ogg output.avi
    

Я думал, что ffmpeg будет автоматически использовать наиболее подходящие аудио / видео кодеки и настройки. К сожалению, это не работает в некоторых дистрибутивах Linux (например, [ac3 @ 0x1e60380] invalid bit rate с 0.8.6-6:0.8.6-0ubuntu0.12.10.1 ).

Очевидно, было бы лучше сделать это за один проход, а не создавать временную звуковую дорожку.

1 ответ1

2

Версии ffmpeg и упаковка ffmpeg самостоятельно

Если кто-то использует ffmpeg 0.5.10, то вы действительно не виноваты, если что-то не работает. Причина номер один проблем с командами ffmpeg (по крайней мере из моего опыта) - устаревшая версия. Между 0.5 и 1.2 недавно появились тысячи исправленных ошибок и сотни новых функций. В частности, они изменили (и удалили) несколько параметров командной строки, которые нарушают некоторые рабочие процессы.

Обратите внимание, что Ubuntu из- за некоторых обстоятельств на самом деле не использует ffmpeg из проекта FFmpeg, а фактически использует avconv от avconv . В более новых версиях Ubuntu это так. Старые версии Ubuntu по-прежнему поставляли двоичный файл с именем ffmpeg , пришедший из Libav, который сломан и устарел, но люди все еще думают, что он исходит от FFmpeg. Итог: вы не можете и не должны доверять своему пользователю иметь работающий двоичный файл ffmpeg в своей системе.

Есть много проектов, которые включают часть инструментов FFmpeg, и вы можете включить статическую сборку в свое программное обеспечение, если это не является юридической проблемой (IANAL, поэтому, пожалуйста, проверьте). Единственный недостаток, который я вижу здесь, это то, что старые ядра могут не запускать все статические сборки.


Это все, что говорится, вот что должно работать везде, при условии, что ffmpeg был скомпилирован с libx264 и libmp3lame включены. Исходная команда, которая у вас была, не будет работать надежно, потому что аудио в Vorbis проблематично в AVI, а кодер AC3, который автоматически выбран для AVI, может засорить некоторые входы. Кроме того, вы перекодируете аудио с Vorbis в AC3, что ухудшает качество.

Извлечь аудио в MP3

Скорее экспортируйте в аудио MP3, например, с CBR 320 кбит / с или VBR 4 (эквивалент LAME -V ). Последний может не работать на старых версиях из- :a суффикса:

ffmpeg -v error -i source_1_path -vn -acodec libmp3lame -ab 320k audio_track.mp3
ffmpeg -v error -i source_1_path -vn -acodec libmp3lame -q:a 4 audio_track.mp3

Объединить с видео H.264

Для объединения мы будем использовать видео x264 (кодер H.264):

ffmpeg -v error -f image2 -r 1 -i frame_pattern.jpg -i audio_track.mp3 \
-acodec copy -vcodec libx264 output.mp4

Здесь вы просто копируете аудиопоток вместо того, чтобы ffmpeg перекодировал его. Это поможет вам сохранить оригинальное качество.

Что касается видео, обратите внимание, что не все устройства могут воспроизводить H.264 из коробки. Некоторые могут воспроизводить H.264 только с базовым профилем, который вы устанавливаете с -profile:v baseline в более новом ffmpeg , или -vprofile baseline в некоторых версиях около 0.7 (не уверен, какой… это было недокументировано в то время), или -vpre baseline для действительно старых версий, которые использовали внутренние пресеты вместо использования библиотеки кодировщика x264.

Альтернатива: объединить с MPEG-4 видео

Если H.264 не подходит, вы можете попробовать видео MPEG-4 Part II - здесь с битрейтом 2 Мбит / с, установленным через -vb:

ffmpeg -v error -f image2 -r 1 -i frame_pattern.jpg -i audio_track.mp3 \
-acodec copy -vcodec mpeg4 -vb 2M output.mp4

Параметр должен быть -b:v сейчас, но старый псевдоним все еще работает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .