단일 .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입니다.