如何实时流式传输音频文件

时间:2019-01-17 15:58:37

标签: audio rust streaming mp3

我正在编写一个音频流服务器-与Icecast类似,我遇到了流音频文件的问题。代理音频工作正常(音频源实时连接并发送音频,然后通过HTTP传输给客户端),但是当我尝试流式传输音频文件时,它很快就完成了-客户端最终将整个音频文件存储在其中他们的本地缓冲区。我希望他们的本地缓冲区只有几秒钟的时间。

从本质上讲,如何降低通过HTTP发送音频文件的速度? 这些文件都是MP3。通过尝试使用硬编码的线程延迟等,我已经设法使其工作了很多……但这不是一个可持续的解决方案。

2 个答案:

答案 0 :(得分:0)

如果您坚持使用http,则可以使用分块传输编码并延迟发送数据包/块。这确实类似于硬编码的thread::sleep,但是您可以使用事件循环来确定何时发送下一个块,而不是暂停线程。

不过,您可能会遇到计时问题,也许您的睡眠逻辑导致的延迟比歌曲的运行时间更长。 YouTube与您所说的逻辑类似。看起来他们将视频分成多个http请求,并且当缓冲区太小时,前端客户端会请求一个新块。将文件分为多个http正文请求,然后在客户端重新组合它们可能具有您要查找的特征。

您可以简单地实现http Range标头,并允许客户端仅请求mp3文件的特定Rangehttps://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests

答案 1 :(得分:0)

(到目前为止)最简单的方法是让客户端按需请求音频文件的块。 std::net::TcpStream(这就是您说的)没有限制传输速率的方法,因此,除了使用硬编码线程延迟外,您没有太多选择来限制流后端。< / p>

作为示例,您可以让客户端存储一段音频,然后当用户收听音频的时间到达该段结束之前的某个点(或向前跳过)时,客户端向服务器发出请求获取相关细分。

这类似于现实流服务(例如Youtube)的工作方式,因为正如您所说,将整个文件存储在客户端是个坏主意。

相关问题