Linux
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
我不確定它是一個 sox 問題還是一個終端問題。這是什麼意思(我該如何解決)?
我確實在 pifm 命令之後放置了“完成”,但是它為每個文件執行一次 pifm 命令,但我希望 pifm 命令不斷執行,並且 forloop 只會繼續播放它的文件。
你給 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
的文件名和列印文件名。-name``.mp3``\0
sort
來自管道 / 的隨機-R
輸入,find
它是-z
零分隔的。(又名洗牌)xargs
連接由-0
零分隔文件名給出的文件。sox
-t mp3 -
: 輸入從標準輸入讀取的 mp3 (標準輸入)-t wav -
: 輸入 wav 寫入標準輸出(標準輸出)play
來自標準輸入的數據-
如果您可以保證文件名中沒有換行符,您也可以使用臨時播放列表。在這裡 M3U,如果您想看中,請查看 wiki。
#! /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 -