如何实时传输音频文件

问题描述 投票:0回答:3

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

本质上,如何减慢通过 HTTP 发送音频文件的速度? 文件都是MP3。我已经通过尝试硬编码线程延迟等设法让它几乎正常工作......但这不是一个可持续的解决方案。

audio rust streaming mp3
3个回答
0
投票

如果您坚持使用http,您可以使用分块传输编码并延迟发送数据包/块。这确实类似于硬编码

thread::sleep
,但您可以使用事件循环来确定何时发送下一个块,而不是暂停线程。

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

您可以简单地实现 http

Range
标头,并允许客户端仅请求 mp3 文件的特定
Range
https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests


0
投票

(到目前为止)最简单的方法是让客户端按需请求音频文件块。

std::net::TcpStream
(这就是您所说的您正在使用的)没有限制传输速率的方法,因此除了使用硬编码线程延迟之外,您没有太多选项来限制流后端。

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

这类似于现实世界的流媒体服务(如 Youtube)的工作方式,因为正如您所说,在客户端存储整个文件不是一个好主意。


0
投票

您的项目有公共存储库吗?我也对 Rust 音频流服务器感兴趣。

© www.soinside.com 2019 - 2024. All rights reserved.