터미널에서 다음 명령을 실행합니다.
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
$path
where로 끝나는 파일을 검색-name
하고.mp3
0바이트로 구분된 파일 이름을 인쇄합니다.\0
sort
-R
파이프의 무작위 입력 / 는 0find
으로 구분됩니다-z
. (일명 셔플)xargs
0 으로 구분된 파일 이름으로 지정된-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 -