浏览器如何请求音频流?它是在进行流式传输,还是 "progressive downloads"?

How does the browser request an audio stream? And is it doing streaming, or "progressive downloads"?

以下代码似乎从主机(Google 云存储)流式传输音频。可以看到播放时有缓冲,所以显然不是在播放前下载整个文件:

<audio controls preload="auto">
  <source src="https://my-audiofile-on-google-cloud-storage.mp3" type="audio/mpeg">
</audio>

我很想知道:

It can be seen buffering while playing, so it's clearly not downloading the entire file before playing

没错。浏览器会提前下载一些数据,但不会下载整个文件。

Is it doing "true streaming" or progressive downloads?

浏览器并不真正知道或关心它的上游是什么。它请求了一些 MP3 数据,它得到了一些 MP3 数据。数据是否以典型的实时数据速率传入、是否实时记录或是否先从磁盘加载都无关紧要。

这被认为是“渐进式”流式传输,那仍然是“流式传输”。不要过多解读这种区别。 (而且,如果您问这些问题有背景,请告诉我们,以便我们提供更好的答案。)

What kind of request is the audio player making to the storage server?

您的 HTML 指定的 HTTP 请求。 URL 以 https:// 开头...这是一个基于 SSL/TLS 的 HTTP 请求。

Would any host be able to stream? I'm using Google; wondering how common it is for storage providers to stream content.

这个流媒体。真的不确定你在这里得到了什么。

通过 HTTP 进行流式传输是目前最常见的流式传输方法。唯一可行的替代方案是 WebRTC,它面向低延迟实时流媒体,具有严重的质量权衡,并且通常需要昂贵的基础设施。您有预先录制的文件,因此这绝对不适用于您的用例。即使您正在直播,您仍然可以通过 HLS/DASH 使用 HTTP,甚至可以通过 SHOUTcast/Icecast.

之类的方式使用 HTTP 渐进式直播

Can the streaming parameters be changed? (for example, how much buffering is done)

当您使用 HTMLAudioElement 时,您将这些参数委托给浏览器。通常,它会做出不错的决定。例如,浏览器知道用户是否处于某种数据或电池省电模式,或者有多少内存可用。有时,出于这些原因,它可能会选择不预缓冲媒体数据。其他时候,如果资源不是问题,它可能会额外预缓冲。

您可以通过切换到 MediaSource Extensions 对此进行更多控制。编解码器和容器存在局限性,但您可以更好地控制媒体数据的缓冲和获取。您也可以考虑使用 Service Worker,但请注意,Service Worker 并不总是可用的,因此您不能依赖于加载它们。