Linux

Sox/Terminal 正在給我打電話“無法在音頻文件中倒帶”

  • July 5, 2021

我在終端上執行這個命令:

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 -

引用自:https://unix.stackexchange.com/questions/657013