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 파일이 있는지 알고 싶다면 다음을 수행할 수 있습니다 find . -name "*.wav". 일반적으로 이는 각 파일을 새 줄에 출력합니다. 이로 -print0인해 일치 항목이 null 문자로 구분됩니다. 이를 통해 출력을 다음 명령으로 전달할 때 공백이 있는 파일 이름을 올바르게 처리할 수 있습니다.

|역할을 도관이라고 합니다. 이는 쉘에게 왼쪽 명령의 출력을 가져와서 오른쪽 명령(이 경우 read루프 내부 명령) 에 입력으로 전달하도록 지시합니다 while.

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

while 루프를 사용하면 read"file"에 일치하는 각 파일 이름에 대한 값이 반복적으로 할당됩니다. while 루프에 대한 표준 bash 구문의 일부 do입니다 .done

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을 사용하는 경우 -vbr 또는 -ab가 아닌 -aq만 지원합니다.

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보다 품질이 낮고 결과적으로 libfdk_aac보다 품질이 낮습니다. --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가 가장 높습니다.

관련 정보