모노 44kHz 오디오 파일을 16kHz 오디오 파일로 리샘플링하기 위해 "sox" 유틸리티를 두 개의 파이프 명령에 넣으려고 합니다.
단일 파이프로 잘 작동합니다.
$ speexdec toto.oga - | sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k toto.wav
그러나 다른 파이프를 추가하면 sox 유틸리티가 다음과 같이 불평합니다.
$ speexdec toto.oga - | sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k - | cat - > toto.wav
sox FAIL formats: can't determine type of `-'
어떤 아이디어가 있나요?
답변1
-t wav
두 번째 출력 앞에 추가하여 sox 출력 유형을 선언해야 합니다 -
.
파일 이름인 경우 sox는 이름을 보고 거기에서 유형을 추론하지만, stdout인 경우 유형을 선언해야 합니다.
마지막으로 지정된 출력 -b 16 -e signed -c 1
이전에 입력에서 전송되었다고 가정하는 대신 다른 모든 설정( )을 선언할 수도 있습니다 .-
답변2
예를 들어 명시적인 파일 이름을 지정하면 toto.wav
SoX는 .wav
확장자로부터 WAV 형식을 사용해야 한다고 추론합니다. 출력된 "filename" 의 경우 -
파생이 불가능하므로 명시적으로 지정된 타입을 사용해야 합니다 -t wav
. 파일에 다른 확장자를 지정 toto.sound
하거나( ) 확장자를 전혀 지정하지 않으려는 경우( )에도 toto
동일하게 적용됩니다 .
관련 없는 메모에서 WAV 파일은 파일 시작 부분에 포함된 오디오의 길이를 저장합니다. 귀하의 경우 파일의 해당 부분이 파이프에 기록되면 최종 길이를 알 수 없으므로 "알 수 없는 길이"를 나타내는 값이 기록됩니다. 이는 파일로 수행하려는 작업에 따라 문제가 될 수도 있고 그렇지 않을 수도 있습니다.
답변3
speexdec toto.oga - | \
sox -V \
-t raw -b 16 -e signed -c 1 -r 44.1k - \
-t raw -b 16 -e signed -c 1 -r 16k - | \
cat - > toto.wav