1

Я пытаюсь выполнить пакетное преобразование набора видеофайлов, где некоторые имеют звук aac, а некоторые имеют формат wav, raw PCM или другие подобные форматы.

Я ищу способ:

  • Скопируйте аудиопоток, если он уже aac (-c:a copy)
  • Перекодируйте аудиопоток в aac, если он еще не aac (-c:a aac -b:a 160k)

Мой текущий подход заключается в том, чтобы вручную определить, какие файлы не имеют аудиопотока aac, и конвертировать их отдельно, но было бы неплохо преобразовать все файлы вместе.

Есть ли способ вставить условный оператор для аудио в команду FFMpeg, как показано ниже?

for f in *.mkv; do
    ffmpeg -i "$f" -c:v libx264 -c:a [some magic here] "${f%.*}_new.mkv"
done

2 ответа2

5

В ffmpeg нет условного оператора для кодирования или потокового копирования, если ввод не является конкретным форматом. Однако вы можете использовать ffprobe для определения формата аудио, а затем использовать ffmpeg для кодирования или потокового копирования аудио.

Вот простой скрипт, демонстрирующий, как это сделать. Скопируйте и сохраните его, дайте ему разрешение на выполнение с помощью chmod +x yourscriptname , затем запустите его с ./yourscriptname input.foo:

#!/bin/bash

audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$1")

if [ "$audioformat" = "aac" ]; then
  ffmpeg -i "$1" -c:v libx264 -c:a copy "${1%.*}_new.mkv"
else
  ffmpeg -i "$1" -c:v libx264 -c:a aac "${1%.*}_new.mkv"
fi

Вы можете легко изменить это, чтобы соответствовать вашим потребностям.

2

Это удивительно тонкая проблема. Мне потребовалось много времени и много проходов, чтобы решить все угловые дела. Я разместил свое решение онлайн здесь.

Мой конкретный пример использования - создание файлов *.mp4 для воспроизведения на iPad Air 2 с использованием macOS, но все используемые инструменты обычно доступны в Linux, и решение легко адаптируется к другим типам устройств.

Вот некоторые из моих заметок о том, как сделать эту адаптацию, с домашней страницы проекта:

Проект состоит из трех сценариев оболочки Bash, которые управляют ffmpeg, ffprobe, mediainfo и atomicparsley для преобразования файлов любого типа, поддерживаемых этими программами, в файлы H.264 * .mp4, подходящие для воспроизведения на устройстве класса iPad Air 2.

Скрипты действительно содержат некоторые из форм macOS, поэтому скрипты нуждаются в некоторой корректировке для использования в Linux или для использования в Windows под Cygwin, MSYS или WSL:

  1. Программа rmtrash действует как rm за исключением того, что файлы перемещаются в папку "Корзина" пользователя. Многие подобные инструменты существуют для других систем, или вы можете просто заменить эту строку в ipad-h264 на вызов rm или какой-либо другой тип команды "выйти из пути".

  2. Вызов open - это механизм macOS для открытия файла с помощью программы GUI, связанной с ним. У меня есть файлы *.mp4 связанные с Subler, потому что следующим шагом после повторного смешивания или перекодирования является просмотр тегов, применение обложки и т.д. В Cygwin вы можете получить тот же эффект с помощью cygstart. Я предполагаю, что есть способ получить аналогичный эффект на Linux. С другой стороны, вы можете просто жестко запрограммировать следующий шаг вместо моей open команды.

Вы можете скачать программное обеспечение из репозитория, используя ссылки в разделе «Загрузки» на домашней странице.

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