sox를 사용하여 mp3 파일을 wav로 일괄 변환

sox를 사용하여 mp3 파일을 wav로 일괄 변환

단일 .mp3의 경우 다음을 사용하여 wav로 변환할 수 있습니다.

sox ./input/filename.mp3 ./output/filename.wav

나는 시도했다:

#!/bin/bash
for i in  $(ls *mp3)
do
    sox -t wav $i waves/$(basename $i)
done

하지만 다음과 같은 오류가 발생합니다.

sox FAIL formats: can't open input file `filename.mp3': WAVE: RIFF header not found

입력 폴더의 모든 mp3 파일에 대해 이 sox 변환을 실행하고 결과 wav를 출력 폴더에 저장하려면 어떻게 해야 합니까?

추신: 백틱(`)과 아포스트로피 사이에 포함된 파일이 표시되는 이유를 모르겠습니다.'

`파일명.mp3'

나는 모든 mp3를 재생했고 그 파일은 잘 작동했습니다.

답변1

파일 이름에 공백이 있는 문제가 있는 것 같습니다. "My Greatest Hits.mp3"라는 파일이 있는 경우 명령은 "My", "Greatest" 및 "Hits.mp3"라는 세 가지 다른 파일을 변환하려고 시도합니다. "$()" 구문을 사용하지 마십시오. for 행에 "*.mp3"를 사용하고 sox 명령에서 파일 이름을 인용하십시오.

또한 basename 명령은 파일 확장자를 제거하지 않고 폴더 이름만 제거합니다. 따라서 이 명령은 ".mp3" 확장자를 가진 여러 개의 WAV 파일을 생성합니다. 명령에 "-s .mp3"를 추가하면 basename에 확장자를 제거하라고 지시하고, 끝에 ".wav"를 넣으면 올바른 확장자가 추가됩니다.

그것들을 합치면 다음과 같은 결과를 얻을 수 있습니다.

for i in *.mp3
do
    sox "$i" "waves/$(basename -s .mp3 "$i").wav"
done

답변2

우선 ls그런 식으로 사용하지 마세요. 실제로는 그렇지 않습니다.하다어쨌든 실제로는 glob에 파일 이름을 생성하는 쉘이기 때문입니다 *mp3. 또한 파일 이름에 공백이 포함되어 있으면 중단됩니다.

오류에 관해서는 sox귀하가 제공한 플래그 때문에 MP3 파일을 wav로 해석하려고 시도한 것 같습니다 -t wav. 단일 파일 케이스에서 했던 것처럼 그것 없이도 할 수 있다고 생각합니다. 출력 파일 이름의 확장자를 변경하기만 하면 됩니다. basename제거할 항목을 지정하면 접미사도 제거할 수 있습니다.

#!/bin/bash
for i in *.mp3
do
    sox "$i" "waves/$(basename "$i" .mp3).wav"
done

(백틱 아포스트로피는 `quoting'파일 이름에 대한 오래된 규칙입니다. 백틱은 회전된 쉼표(Wikipedia의 예 보기). 그러나 기술적으로 이것은 잘못된 것이며 대부분의 최신 글꼴에서는 끔찍해 보입니다. )

답변3

분명히 sox는 mp3 형식 파일을 처리할 수 없다고 말합니다. 나는 귀하의 시스템에서 다음과 같은 결과를 얻고 싶습니다.

sox ./input/파일 이름.mp3 ./output/파일 이름.wav

당신의 양말은 일반적으로 mp3를 처리할 수 없는 것 같기 때문입니다. 예, mp3를 처리하기 위해 sox를 ​​다시 컴파일할 수 있지만 오류 메시지에는 파일을 읽는 중이지만 wav:가 필요하다는 내용이 표시됩니다 WAVE: RIFF header not found.

공간 문제에 대한 다른 의견은 여전히 ​​적용되지만 파일에는 filename.mp3공백이 없습니다. mp3입니다.

관련 정보