使用 cURL 下载网络流

使用 cURL 下载网络流

我正在尝试从在线广播电台下载流音频源。该电台以前采用 MP3 广播方式运营,但现在已升级为 AAC HTTP 音频广播

我曾经在终端中使用“streamripper”来翻录电台,供我开车时收听,但是现在 streamripper 无法抓取新的流。我很确定该电台现在正在为其流媒体使用 http 分块传输编码,而 streamripper 不支持这种编码。

我想出了一个新的解决方案,我将音频源与电台的网络播放器隔离开来,然后我正在利用 cURL 将 feed 翻录成音频文件我可以随身携带。

然而我不断在 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写入 stdout。我们将整个循环重定向到一个文件,无论需要多少次重启。这样,多个连续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退出而下一个流尚未接管的时间戳),但这种“故障”不应该阻止真正知道如何处理此类流的播放器。

相关内容