У меня около 70 файлов mp4, и я хочу напрямую извлечь аудиофайлы без транскодирования. Все файлы mp4 имеют аудиофайлы aac.
Насколько я понимаю, я могу использовать следующую команду для извлечения аудиофайла из одного из файлов mp4:
avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"
Как извлечь все аудиофайлы из всех файлов 70 mp4, поэтому я получаю 70 файлов aac?
Ответ Xiao, как правило, наиболее полезен, если у вас есть все файлы в одном каталоге; но если файлы MP4 разбросаны в разных каталогах, вы можете использовать эту команду find для их преобразования.
find . -type f -name '*.mp4' -exec bash -c 'avconv -i "$0" -c:a copy "${0/%mp4/m4a}"' {} \;
В конце используется немного другая форма замены bash string: «$ {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 к последнему (говоря: «raw 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