rust 如何流音频文件在真实的时间

cqoc49vn  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(95)

我正在写一个音频流服务器-类似于Icecast,我遇到了一个问题,流音频文件。代理音频工作正常(音频源连接并以真实的时间发送音频,然后通过HTTP传输到客户端),但当我尝试流式传输音频文件时,它会很快-客户端最终在他们的本地缓冲区内的整个音频文件。我希望他们在他们的本地缓冲区只有几十秒。
基本上,我怎么能减慢通过HTTP发送音频文件的速度?这些文件都是MP3。我已经设法通过硬编码线程延迟等试验来使其工作得很好.但这不是一个可持续的解决方案。

rseugnpd

rseugnpd1#

如果你坚持使用http,你可以使用chunked transfer编码并延迟发送数据包/数据块,这确实类似于硬编码的thread::sleep,但你可以使用事件循环来确定何时发送下一个数据块,而不是暂停线程。
你可能会遇到时间问题,也许你的睡眠逻辑导致了比歌曲运行时更长的延迟。YouTube与你所说的逻辑类似。看起来他们将视频分成多个http请求,当缓冲区太小时,前端客户端请求一个新的块。将文件分成多个http主体请求,然后在客户端重新组装它们可能具有以下特征你要找的人
您可以简单地实现http Range头,并允许客户端仅请求mp3文件的特定Rangehttps://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests

yftpprvb

yftpprvb2#

最简单的方法(到目前为止)是让客户端按需请求音频文件的块。std::net::TcpStream(这是你说你正在使用的)没有一种方法来限制传输速率,所以你没有太多的选择来限制流后端,除非使用硬编码的线程延迟。
举个例子,你可以让你的客户端存储一段音频,当用户在收听音频时到达该段结束之前的某个点(或跳过),客户端向服务器请求获取相关的段。
这类似于真实世界的流媒体服务(如Youtube)的工作方式,因为正如你所说,将整个文件存储在客户端是一个坏主意。

相关问题