Пакетное извлечение аудио с помощью avconv без транскодирования

У меня есть около 70 файлов mp4, и я хочу извлечь аудиофайлы напрямую без дальнейшего перекодирования. Все файлы mp4 имеют аудио файлы aac.

Я понимаю, что могу использовать следующую команду для извлечения аудиофайла из одного из файлов mp4:

avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"

Как извлечь все аудиофайлы из всех файлов 70 mp4, чтобы я получил 70 файлов aac?

4 ответа

Решение

Вы можете использовать простой цикл for:

for i in *.mp4; do
    avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"
done

или на одной строке:

for i in *.mp4; do avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"; done

Что делает, это бежит avconv один раз для каждого файла с именем как *.mp4 где имя файла хранится в ${i} переменная.

${i%.mp4} средства ${i} (т.е. имя файла) с .mp4 сняли с конца.

Ответ Сяо, как правило, наиболее полезен, если у вас есть все файлы в одном каталоге; но если файлы MP4 разбросаны по разным каталогам, вы можете использовать это find Команда, чтобы преобразовать их всех.

find . -type f -name '*.mp4' -exec bash -c 'avconv -i "$0" -c:a copy "${0/%mp4/m4a}"' {} \;

При этом в конце используется немного другая форма подстановки строки bash: "${0/%mp4/m4a}" говорит bash заменить mp4 на m4a, но только если mp4 находится в конце строки.

Чтобы избежать одновременной обработки нескольких файлов (которые могут использовать слишком много ресурсов), используйте parallel, По умолчанию он выполняет только одну работу за раз. Если вы хотите использовать несколько процессорных ядер параллельно, попробуйте parallel -j 4 ... на 4 рабочих места параллельно. Также проверьте man parallel,

sudo apt-get install parallel

Эта строка будет извлекать aac аудиофайлы из выбранных видео и поместите их в m4a контейнеры.

parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F

При работе прямо в CLI, заменить%F со списком ваших входных файлов. Например *.mp4,

Вдохновленный этим ответом, предыдущим ответом на этот вопрос и комментарием evilsoup к последнему (говоря: "сырые файлы aac не могут содержать метаданные; если вы хотите сохранить метаданные из исходных файлов, используйте m4a (который это просто другое название для mp4, но довольно широко признано аудио-плеерами) вместо aac как расширение файла ').

Я использую такие команды в пользовательских действиях Thunar,

введите описание здесь

ограничивая приложение видео, которые содержат aac аудио.

введите описание здесь

Чтобы во время обработки было открыто окно терминала, которое закрывается в конце, команду можно изменить следующим образом:

 gnome-terminal -e "parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F"

Я расширил ответ @Xiao-Long Chen, превратив его в скрипт, который пропускает файлы, когда выходной файл новее:

#!/bin/bash

for file in *.mp4; do
    OUT="${file/.mp4/.m4a}"

    if [ "$file" == "$OUT" ]; then
        echo "Unable to handle $file" >&2
        exit 1
    fi

    if [ "$OUT" -nt "$file" ]; then
        echo "Skipping $file; output file is newer."
        continue
    fi

    echo "Converting \"$file\" -> \"$OUT\""
    avconv -loglevel warning -i "$file" -map 0:1 -c:a copy "$OUT"
done
Другие вопросы по тегам