我正在嘗試從線上廣播電台下載串流音訊來源。該電台過去以 MP3 喊播來源運行,但現在已升級為 AAC HTTP 音訊來源。
我曾經在航站樓使用“streamripper”來撕裂車站以供我乘車使用,但是現在 Streamripper 無法抓取新串流。我非常確定該電台現在正在為其流使用 http 分塊傳輸編碼,而 Streamripper 不支援該編碼。
我想出了一個新的解決方案,我將音訊來源與電台的網路播放器隔離,並且我正在利用 cURL 將提要轉換為音訊文件我可以隨身攜帶。
然而當我的 cURL 應該無休止地記錄時,我不斷地得到“完成”。我甚至將最大時間參數設為 43200 秒(12 小時),但我最終得到的檔案大小各不相同。通常每個產生的檔案不超過 1 小時。但有時可能會超過一個小時。文件大小和時間不同。文件在短時間內“中斷/完成”,我必須使用腳本來重新啟動 cURL 記錄。我最終得到了一大堆分形錄音,而我每天應該只有 2 個錄音(每 12 小時)。當我查看 cURL 傳輸的詳細資訊時,它只是以“cURL 連接保持完好”結束。 cURL日誌中沒有錯誤,因此我不確定如何強制 cURL 嘗試“重新連接”並繼續將流解析到同一個文件中,即使它認為它已經完成。
我也嘗試過使用“wget”和“Jdownloader”,它們都有相同的結果,即在很短的時間後完成。
我不確定我能做什麼來強制重新連接並繼續下載到同一文件而不覆蓋它。
我該如何確保我的錄音不會「損壞」?我能做些什麼來強制重新連結嗎?或者也許有某種方法可以告訴 cURL 等待,即使 cURL 傳輸速度降至 0?
任何想法將不勝感激。
謝謝
答案1
我如何強制 cURL 嘗試“重新連接”並繼續將流解析到同一個文件中,即使它認為它已完成
通用方法(不是特定於curl
)是:
while true; do curl -o - … ; done >file
重點是curl
寫入標準輸出。我們將整個循環重新導向到一個文件,無論需要重新啟動多少次。這樣,多個連續進程的輸出curl
就會連接起來並保存到一個檔案中。
要運作 12 小時:
timeout 12h sh -c 'while true; do curl -o - … ; done >file'
若要不間斷運作並每 12 小時建立一個新檔案:
while true; do
timeout 12h sh -c 'while true; do curl -o - … ; done >"audio_feed_$(date +%Y-%m-%d_%T)"'
done
要按需啟動新文件,只需殺死當前文件timeout
或sh
它的子文件即可。
注意我不知道時不時丟失幾秒鐘但連接起來的串流是否會產生可播放的檔案。我希望設計為透過網路即時串流的協定/容器/編解碼器能夠在遺失片段後重新同步;無論數據來自伺服器還是文件,這都應該有效。如果您要捕獲的串流是這樣的,那麼您在稍後播放時會遇到“內容丟失”的情況(在一個curl
退出且下一個尚未接管的時間戳上),但這種“打嗝”不應該阻止玩家真正知道如何處理這樣的串流。