Sox/Terminal에서 "오디오 파일을 되감을 수 없습니다"라고 표시됩니다.

Sox/Terminal에서 "오디오 파일을 되감을 수 없습니다"라고 표시됩니다.

터미널에서 다음 명령을 실행합니다.

for i in  $(ls -1 /home/pi/Desktop/Music/Acapella/*.mp3|sort -R); do sox -t mp3 $i -t wav - ; done | sudo ./pi_fm_rds -freq 102.1  -audio - -ps ZSFM -rt "ZSFM"

기본적으로 forloop를 사용하여 디렉토리의 모든 파일을 반복하고 즉시 wav 파일로 변환한 다음 pifm 명령으로 파이프됩니다. 하지만 유일한 문제는 첫 번째 파일 다음에 다음과 같이 표시된다는 것입니다.

sox WARN sox: `-' output clipped 773 samples; decrease volume?
Could not rewind in audio file, terminating
Terminating: cleanly deactivated the DMA engine and killed the carrier

이게 양말 문제인지 단말기 문제인지는 잘 모르겠습니다. 이것이 의미하는 바는 무엇이며 해결 방법은 무엇입니까?

pifm 명령 뒤에 "done"을 입력했지만 각 파일에 대해 pfm 명령이 한 번 실행되지만 pifm 명령은 계속 실행되고 forloop는 재생되는 파일에서만 실행되기를 원합니다.

답변1

sox에 파일을 제공하고 있습니다. 변환 및 스트리밍한 후 다음 파일을 가져오기 전에 종료됩니다.

여러 가지 방법으로 이 작업을 수행할 수 있습니다. 그리고 아니요, ls그런 식으로 사용 하지 마세요.

play테스트 목적 으로 사용하는 것 :

#! /bin/sh -

path="/home/pi/Desktop/Music/Acapella/"

find "$path" -name '*.mp3' -print0 |
    sort -z -R |
    xargs -0 cat |
    sox -t mp3 - -t wav - |
    play -

여기 누군가가 말했어요

  • find$pathwhere로 끝나는 파일을 검색 -name하고 .mp30바이트로 구분된 파일 이름을 인쇄합니다.\0
  • sort-R파이프의 무작위 입력 / 는 0 find으로 구분됩니다 -z. (일명 셔플)
  • xargs0 으로 구분된 파일 이름으로 지정된 -0파일을 연결합니다.
  • sox
    • -t mp3 -: stdin에서 읽은 mp3 입력(표준 입력)
    • -t wav -: wav를 입력하고 표준 출력에 씁니다(표준 출력).
  • play표준 입력의 데이터-

파일 이름에 줄 바꿈이 없다는 것을 보장할 수 있는 경우 임시 재생 목록을 사용할 수도 있습니다.M3U 입니다, 더 알고 싶다면 Wikipedia를 참조하세요.

#! /bin/sh -

# ARG 1 is path
path="$1"

# Create temporary file to use as playlist
playlist="$(mktemp /tmp/sox.XXXXXXXX.m3u)"
# Delete playlist on exit
trap 'rm "$playlist"' EXIT

#Create playlist
find "$path" -name '*.mp3' -print |
    sort -R >"$playlist"

sox "$playlist" -t wav - | play -

관련 정보