Пакетное извлечение аудио с помощью 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