端末で次のコマンドを実行します。
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コマンドが1回実行されますが、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
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 -