Как преобразовать все .wav файлы в подкаталогах к .aac, использующему neroAacEnc?

Скажите pdflatex не ожидать любого интерактивного входа когда-либо:

pdflatex -interaction nonstopmode "$1"

Если команда возвращает ненулевое состояние ($?), была ошибка, таким образом, метка 0. Иначе протестируйте ли файл журнала (как $1, но с .log вместо расширения это уже там), содержит слово Warning; если это делает, метка равняется 1, иначе метка 0.

5
21.04.2013, 23:38
3 ответа

Вот быстрая острота, которую можно ввести в терминале:

find . -name "*.wav" -print0 | while read -d $'\0' file; do neroAacEnc -2pass -q 1 -if "$file" -of "${file%wav}m4a"; done

Можно также использовать ffmpeg, как @slm предполагает,

find . -name "*.wav" -print0 | while read -d $'\0' file; do ffmpeg -i "$file" -c:a libfdk_aac -vbr 3 output.m4a "${file%wav}m4a"; done

Я не уверен, как neroAacEnc выдерживает сравнение с ffmpeg, но я знаю, что ffmpeg совершенствуется довольно популярный у многих пользователей Linux.


Объяснение

find программа, которая возвращает пути к файлам, которые соответствуют определенному свойству файла, в этом случае имя файла. Если бы все, что Вы хотели знать, было тем, какие .wav файлы находятся в подкаталогах Вашего текущего пути, то Вы сделали бы find . -name "*.wav". Обычно это производит каждый файл на новой строке. -print0 заставляет его разделить соответствия с нулевым символом вместо этого. Это допускает правильное обращение имен файлов с пробелами, когда мы передаем вывод следующим командам.

| символ известен как канал. Это говорит оболочке брать вывод команды слева и передавать его как вход к команде справа, в этом случае, read команда в while цикл.

read команда используется для взятия вывода find и присвойте его переменной, "файлу". Обычно это присвоило бы значения, чтобы "зарегистрировать" каждое слово за один раз, но -d $'\0'$ заставляет присвоения быть разграниченными нулевым символом (соответствие, как мы разграничили файлы в find при помощи -print0 флаг).

Причины циклов с условием продолжения read многократно присваивать значения "файлу" для каждого имени файла соответствия. do и done часть стандартного синтаксиса удара некоторое время цикл:

while <something is true>; do
    <run some commands>
done

В этом случае, наш "выполненный некоторая команда" также ffmpeg или neroAacEnc. В каждом из случаев, входной файл (т.е. $file) указан с переменной "файла", с которой мы присвоились read, и выходной файл (т.е. ${file%wav}w4a) управление этой переменной, которая позволяет нам указывать другое имя для вывода. Обычно $file или ${file} оценил бы к названию файла, сказал бы некоторый song.wav. % говорит для отключения от права на переменную любой последовательности, соответствующей символам [1] направо от % (т.е. "wav"). Так ${file%wav} оценил бы к некоторой песне., и затем "m4a" там, чтобы быть новым концом имени файла: некоторая песня m4a.


[1] Я говорю "символы" здесь для простоты. Последовательность направо от % могло быть регулярное выражение. Например, если мы сказали ${file%w*v} и переменная была некоторой песней w1234v, она также оценит к некоторой песне..

5
27.01.2020, 20:36
  • 1
    я попробовал это, но я получаю много ошибок. Кажется, что имя файла будит разделение в отдельные исходные данные (имя файла имеет пробелы в нем). Как я могу зафиксировать это? –  OMGtechy 21.04.2013, 23:47
  • 2
    Право, я забыл добавлять кавычки вокруг $file для обработки пробелов в именах файлов. Я обновил команды, попробовать еще раз. –  drs 21.04.2013, 23:55
  • 3
    я должен был опустить-2pass (это оказывается им только, работает с определенным набором других настроек, но исключение, которое это работает отлично.Спасибо! Если Вы могли бы объяснить, почему/какой продолжается здесь, который был бы еще лучше, но если у Вас нет времени, я ценю его независимо. –  OMGtechy 22.04.2013, 00:21
  • 4
    Для записи fdk_aac и neroAacEnc оба считаются хорошими кодерами AAC, в то время как все другие кодеры AAC в ffmpeg... нет. Кроме того, fdk_aac не может быть по закону распределен с ffmpeg в двоичной форме из-за лицензирования проблем, так для использования его необходимо было бы скомпилировать собственный ffmpeg. –  evilsoup 22.04.2013, 03:44
  • 5
    Спасибо за обновление :) Теперь имейте намного лучшее понимание команды находки! –  OMGtechy 25.04.2013, 21:52

Не уверенный в переключателях командной строки к neroAacEnc, но чему-то вроде этого:

% cd <dir where .wav files are>
% find . -type f -name '*.wav' -exec sh -c '
orgfile="$0"
newfile="$(echo "$0" | sed 's/.wav/.aac/')"
neroAacEnc $orgfile $newfile
' {} \;

Или Вы могли использовать ffmpeg, чтобы сделать (непротестированное) преобразование:

% cd <dir where .wav files are>
% find . -type f -name '*.wav' -exec sh -c '
orgfile="$0"
newfile="$(echo "$0" | sed 's/.wav/.aac/')"
ffmpeg -i $orgfile -ab 256 $newfile
' {} \;

Как сценарий (помещает ниже в файл),

#!/bin/bash

# myscript.bash
cd <dir where .wav files are>

find . -type f -name '*.wav' -exec sh -c '
orgfile="$0"
newfile="$(echo "$0" | sed 's/.wav/.aac/')"

neroAacEnc -2pass -q 1 -if $orgfile -of $newfile
' {} \;

После создания файла (myscript.bash) делают это исполняемым файлом chmod +x myscript.bash, выполните его ./myscript.bash, и Вы сделаны.

Ссылки

-FFmpeg и AAC, кодирующий руководство

Примечание: Существуют дополнительные "рецепты" для преобразования .wav к .aac и получению различных качеств, характеристик, и т.д.

2
27.01.2020, 20:36
  • 1
    Это назвали бы как это: neroAacEnc-2pass-q 1 - если <input_file> - <output_file> –  OMGtechy 21.04.2013, 22:43
  • 2
    кроме того, действительно ли это - файл (как исполняемый файл>, или я ввожу все это сразу? Я довольно плохо знаком с Linux с точки зрения знания. –  OMGtechy 21.04.2013, 22:46
  • 3
    Спасибо, я попробовал это, но получите ошибку: "Никакой выходной файл не указан" –  OMGtechy 21.04.2013, 23:53
  • 4
    Можете Вы запускать скрипт, который Вы создали как это: bash -x myscript.bash > debug.log 2>&1 и отправьте содержание debug.log на pastebin.com. –  slm♦ 22.04.2013, 00:26

Я также использовал бы ffmpeg. При использовании libfaac он только поддерживает - AQ и не-vbr или-ab:

for f in **/*.wav; do ffmpeg -i "$f" -c:a libfaac -aq 150 "${f%wav}m4a"; done

** требует удара 4.0 или выше и shopt -s globstar или zsh. Можно показать информацию о файлах результата с ffmpeg -i.

Согласно http://ffmpeg.org/trac/ffmpeg/wiki/AACEncodingGuide, собственный кодер (который использовался, если я не указывал-c:a) является более низким качеством, чем libfaac, который является более низким качеством, чем libfdk_aac. --enable-libfdk_aac --enable-nonfree (или brew install ffmpeg --with-fdk-aac) включает поддержку libfdk_aac.

Если у Вас есть 4 центральных процессора, это доходит до 4 процессов параллельно:

find . -name \*.wav | parallel ffmpeg -i {} -c:a libfdk_aac -vbr 4.5 {.}.m4a

- vbr 0 является самым низким,-vbr 5 является самым высоким.

2
27.01.2020, 20:36
  • 1
    +1 для параллельной обработки, у меня есть четырехъядерное с hyper, распараллеливающим, таким образом, это экономит много времени! –  OMGtechy 22.04.2013, 02:27

Теги

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