как можно пакетно извлечь аудио из файлов mp4 с помощью ffmpeg без распаковки (автоматическое определение аудиокодека)?

У меня 228 файлов mp4 (2,6 ГБ) и я хочу извлечь из них аудио (mp3 или ogg). Я хочу извлечь их из партии - желательно с помощью bash. Я не уверен, что все файлы используют один и тот же аудиокодек, как они были записаны в разные годы, начиная с 2006-2012 гг.

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

Возможно ли это?

19
задан 23 November 2012 в 21:33

2 ответа

Вы говорите, что хотите "извлечь аудио от них (mp3 или ogg)". Но что, если аудио в mp4 файле не является одним из тех? необходимо было бы транскодировать так или иначе. Итак, почему бы не оставить обнаружение формата аудио до ffmpeg?

Преобразовать один файл:

ffmpeg -i videofile.mp4 -vn -acodec libvorbis audiofile.ogg

Преобразовать много файлов:

for vid in *.mp4; do ffmpeg -i "$vid" -vn -acodec libvorbis "${vid%.mp4}.ogg"; done

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

Использовать -acodec libmp3lame и измените расширение от .ogg кому: .mp3 для кодирования mp3.

Если то, что Вы хотите, должно действительно извлечь аудио, можно просто "скопировать" аудиотрек в использование файла -acodec copy. Конечно, основное различие - то, что транскодирование является медленным и интенсивным CPU, в то время как копирование действительно быстро, поскольку Вы просто перемещаете байты от одного файла до другого. Вот то, как скопировать просто аудиотрек (предполагающий, что это находится в mp3 формате):

ffmpeg -i videofile.mp4 -vn -acodec copy audiofile.mp3

Обратите внимание, что в этом случае, формат аудиофайла должен согласовываться с тем, что имеет контейнер (т.е. если аудио является форматом AAC, необходимо сказать audiofile.aac). Можно использовать ffprobe команда для наблюдения, какой кодек Вы имеете это может предоставить некоторую информацию:

ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "videofile.mp4"

Возможный способ автоматически проанализировать аудиокодек и назвать звуковой файл соответственно был бы:

mkdir -p output
# current directory has to contain at least one .mp4 file 
for vid in *.mp4; do
   codec="$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "$vid")"
   case "$codec" in
    mp3    ) filetype=mp3 ;;
    vorbis ) filetype=ogg ;;
    *      ) filetype= ;;
   esac

   if [ "$filetype" ]; then 
    ffmpeg -i "$vid" -vn -acodec copy output/"${vid%.*}"."$filetype"
   else
    ffmpeg -i "$vid" -vn -acodec libvorbis output/"${vid%.*}".ogg
done

Примечания: выходные файлы создаются в подкаталоге output это создает в начале (при необходимости). Для других кодеков, чем mp3 и vorbis это преобразовывает аудио в ogg. Ubuntu 14.04 не имеет ffmpeg в стандартных репозиториях, но Вы могли добавить ppa:mc3man/trusty-media репозиторий и установить ffmpeg пакет для получения необходимого программного обеспечения. Посмотрите здесь для деталей.

28
ответ дан 23 November 2012 в 21:33

Как заявил Николас Рауль, это нужно обновить. Вот та же строка, которую дал roadmr, но вместо этого использовал avconv:

for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done

0
ответ дан 23 November 2012 в 21:33

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

Похожие вопросы: