我正在写一个音频流服务器-类似于Icecast,我遇到了一个问题,流音频文件。代理音频工作正常(音频源连接并以真实的时间发送音频,然后通过HTTP传输到客户端),但当我尝试流式传输音频文件时,它会很快-客户端最终在他们的本地缓冲区内的整个音频文件。我希望他们在他们的本地缓冲区只有几十秒。基本上,我怎么能减慢通过HTTP发送音频文件的速度?这些文件都是MP3。我已经设法通过硬编码线程延迟等试验来使其工作得很好.但这不是一个可持续的解决方案。
rseugnpd1#
如果你坚持使用http,你可以使用chunked transfer编码并延迟发送数据包/数据块,这确实类似于硬编码的thread::sleep,但你可以使用事件循环来确定何时发送下一个数据块,而不是暂停线程。你可能会遇到时间问题,也许你的睡眠逻辑导致了比歌曲运行时更长的延迟。YouTube与你所说的逻辑类似。看起来他们将视频分成多个http请求,当缓冲区太小时,前端客户端请求一个新的块。将文件分成多个http主体请求,然后在客户端重新组装它们可能具有以下特征你要找的人您可以简单地实现http Range头,并允许客户端仅请求mp3文件的特定Range。https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
thread::sleep
Range
yftpprvb2#
最简单的方法(到目前为止)是让客户端按需请求音频文件的块。std::net::TcpStream(这是你说你正在使用的)没有一种方法来限制传输速率,所以你没有太多的选择来限制流后端,除非使用硬编码的线程延迟。举个例子,你可以让你的客户端存储一段音频,当用户在收听音频时到达该段结束之前的某个点(或跳过),客户端向服务器请求获取相关的段。这类似于真实世界的流媒体服务(如Youtube)的工作方式,因为正如你所说,将整个文件存储在客户端是一个坏主意。
std::net::TcpStream
2条答案
按热度按时间rseugnpd1#
如果你坚持使用http,你可以使用chunked transfer编码并延迟发送数据包/数据块,这确实类似于硬编码的
thread::sleep
,但你可以使用事件循环来确定何时发送下一个数据块,而不是暂停线程。你可能会遇到时间问题,也许你的睡眠逻辑导致了比歌曲运行时更长的延迟。YouTube与你所说的逻辑类似。看起来他们将视频分成多个http请求,当缓冲区太小时,前端客户端请求一个新的块。将文件分成多个http主体请求,然后在客户端重新组装它们可能具有以下特征你要找的人
您可以简单地实现http
Range
头,并允许客户端仅请求mp3文件的特定Range
。https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requestsyftpprvb2#
最简单的方法(到目前为止)是让客户端按需请求音频文件的块。
std::net::TcpStream
(这是你说你正在使用的)没有一种方法来限制传输速率,所以你没有太多的选择来限制流后端,除非使用硬编码的线程延迟。举个例子,你可以让你的客户端存储一段音频,当用户在收听音频时到达该段结束之前的某个点(或跳过),客户端向服务器请求获取相关的段。
这类似于真实世界的流媒体服务(如Youtube)的工作方式,因为正如你所说,将整个文件存储在客户端是一个坏主意。