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

@slm이 제안한 것처럼 ffmpeg를 사용할 수도 있습니다.

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 파일이 무엇인지 알고 싶은 경우에는 .wav 파일을 사용하면 됩니다 find . -name "*.wav". 일반적으로 이는 각 파일을 새 줄에 출력합니다. 대신 -print0null 문자로 일치 항목을 구분합니다. 이를 통해 출력을 다음 명령에 전달할 때 공백이 포함된 파일 이름을 적절하게 처리할 수 있습니다.

캐릭터 |는 파이프로 알려져 있습니다. 이는 쉘에게 왼쪽 명령의 출력을 가져와 오른쪽 명령(이 경우 루프 read내의 명령) 에 대한 입력으로 전달하도록 지시합니다 while.

read명령은 출력을 가져와 find변수 "file"에 할당하는 데 사용됩니다. 일반적으로 이는 한 번에 각 단어를 "파일"에 값을 할당하지만 이로 -d $'\0'$인해 할당이 널 문자로 구분됩니다( 플래그를 find사용하여 파일을 구분하는 방법과 일치 -print0).

while 루프는 read일치하는 각 파일 이름에 대해 "파일"에 값을 반복적으로 할당합니다. doand는 while done루프에 대한 표준 bash 구문의 일부입니다.

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

이 경우 "일부 명령 실행"은 ffmpeg또는 입니다 neroAacEnc. 각 경우에 입력 파일(예: $file)은 로 할당한 "file" 변수로 지정되고 read, 출력 파일(예: ${file%wav}w4a)은 이 변수를 조작하여 파일에 대해 다른 이름을 지정할 수 있습니다. 산출. 일반적으로 $file또는 ${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를 지정하지 않은 경우 사용됨)는 libfdk_aac보다 품질이 낮은 libfaac보다 품질이 낮습니다. --enable-libfdk_aac --enable-nonfree(또는 brew install ffmpeg --with-fdk-aac)에는 libfdk_aac에 대한 지원이 포함됩니다.

CPU가 4개 있는 경우 최대 4개의 프로세스가 병렬로 실행됩니다.

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

-vbr 0이 가장 낮고, -vbr 5가 가장 높습니다.

관련 정보