如何使用neroAacEnc 將子目錄中的所有.wav 檔案轉換為.aac?

如何使用neroAacEnc 將子目錄中的所有.wav 檔案轉換為.aac?

我有一組 .wav 格式的音樂,想使用neroAacEnc 將其轉換為.aac/.mp4。

我該怎麼做呢?我正在使用 Arch Linux x86_64 和 Xterm。

答案1

這是您可以在終端機中輸入的快速一行:

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使得它用空字元分隔匹配項。當我們將輸出傳遞給下一個命令時,這允許正確處理帶有空格的檔案名稱。

|角色被稱為管道。它告訴 shell 取得左側命令的輸出並將其作為右側命令(在本例中為循環read內的命令)的輸入傳遞while

read命令用於獲取輸出find並將其分配給變數“文件”。通常,這會一次為「檔案」每個單字分配值,但這-d $'\0'$會導致分配由空字元分隔(find與我們使用-print0標誌分隔檔案的方式相符)。

while 迴圈會導致read為每個符合的檔案名稱迭代地為「file」指派值。和dodonewhile 循環的標準 bash 語法的一部分:

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

在這種情況下,我們的“運行某些命令”是ffmpegneroAacEnc。在每種情況下,輸入檔案(即$file)是用我們指派的「檔案」變數指定的read,而輸出檔案(即${file%wav}w4a)是對此變數的操作,它允許我們為檔案指定不同的名稱。通常$fileor${file}會評估文件的名稱,例如一些歌曲.wav。表示%從變數的右側切斷與右側的字元[1]相符的任何序列%(即“wav”)。所以${file%wav}會評估為一些歌曲。,然後“m4a”將成為檔案名稱的新結尾:一些歌曲.m4a


[1] 為了簡單起見,我在這裡說“字符”。右側的序列%可以是正規表示式。例如,如果我們說${file%w*v}變數是一些歌曲.w1234v,它也會評估為一些歌曲。

答案2

不確定命令列是否切換到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 並獲得不同的品質、特徵等。

答案3

我也會使用 ffmpeg。如果您使用 libfaac,它僅支援 -aq,而不支援 -vbr 或 -ab:

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

**需要 bash 4.0 或更高版本和/shopt -s globstar或 zsh。您可以使用 來顯示有關結果文件的資訊ffmpeg -i

根據http://ffmpeg.org/trac/ffmpeg/wiki/AACEncodingGuide,本機編碼器(如果我沒有指定 -c:a 則使用該編碼器)的品質低於 libfaac,而 libfaac 的品質低於 libfdk_aac。--enable-libfdk_aac --enable-nonfree(或brew install ffmpeg --with-fdk-aac)包括對 libfdk_aac 的支援。

如果您有 4 個 CPU,則最多並行運行 4 個進程:

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

-vbr 0 最低,-vbr 5 最高。

相關內容