python - 有没有办法在没有本地文件的情况下从服务器直播音频?
问题描述
我正在寻找一种从服务器连续流式传输音频的方法,主要问题是服务器端代码它将接收许多 url 来流式传输音频。在某些情况下,网址会被实时交换,而新的音频会被流式传输。我还没有找到不涉及我下载每个文件然后流式传输的解决方案,这会阻碍实时功能。
我尝试将 vlc 用于 python,但它不允许更改当前流式传输的 url。我也尝试过使用 pyaudio,但我无法获得正确的音频格式,更不用说交换音频源了。
一个示例链接,公平警告它会自动播放: 音频
解决方案
要制作发送给客户的连续流,您需要将此项目分成两半。
播出
您需要一些东西来将源流从压缩格式解码为您可以操作的非压缩标准化格式......原始 PCM 样本。使用子进程并将其输出到 STDOUT,以便您可以在 Python 脚本中获取该数据。如果需要,您可以使用 VLC,但 FFmpeg 非常简单:
ffmpeg -i "http://example.com/stream" -ar 48000 -ac 2 -f f32le -acodec pcm_f32le -
这会将原始 PCM 作为 32 位浮点数以 48 kHz 立体声输出到 STDOUT。一旦采用这种标准格式,您就可以任意加入流。因此,当您播放完一个流时,只需终止进程,切换到下一个,然后开始播放新流中的样本。
编码
您想创建一个 PCM 流,然后您可以使用一些外部编码器重新编码,基本上与您在播放时所做的相反。同样,FFmpeg 可以为您做一些事情:
ffmpeg -f f32le -ar 48000 -ac 2 - -f opus -acodec libopus icecast://...
现在,您会注意到此处的输出示例,我建议将其发送到 Icecast。Icecast 是一个不错的流媒体服务器,您可以使用。如果您宁愿直接通过 HTTP 输出,则可以。但是,如果您要向多个听众播放此流,我建议让 Icecast 或类似的服务为您处理。
推荐阅读
- python - 无法在 pyspark 数据框中显示完整的指数形式的数字
- c# - 不完整的 DateTime 与完整的 DateTime 比较
- amazon-web-services - 错误:NotAuthorizedError - AWS eb init 上的操作被拒绝
- node.js - 具有非常频繁增长的数组的 MongoDB 文档的有效设计是什么?
- c - C: 我需要取消一个我用完的线程吗?
- java - 如何在 neovim 中提供提示输入?
- c++ - QMovie 是否支持 Alpha 通道?
- pandas - Pandas 删除具有特定列名的重复列名
- python - 用于服务器 IP 状态 200 的 Raspberry Pi Python 脚本,如果它不是 200 状态代码,则通过电子邮件报告
- python - python Telegram bot 支付问题,例如 paymentbot.py with stripe sevicer