我有 OGG 格式的音频文件并将其嵌入:
<div class="audio-container">
<audio controls>
<source src="/u/audiofile.ogg">
</audio>
</div>
我使用 Chrome 播放嵌入文件(Internet Explorer/Edge 也有同样的问题)。
如果文件长约 3 秒,进度条/播放栏将按预期出现在开头:
如果文件较长,例如25秒,进度条/播放条不起作用,这意味着:点击播放条不会跳转到音频时间:
然而,22秒后(结束前3秒),播放栏突然出现,用户可以通过单击播放栏来跳转音频时间。
正如我们在这里看到的,只有播放完整个 OGG 文件后(不仅加载,而且播放)206 partial content
请求突然有效。
当然,我希望播放栏显示整个音频长度,并且从一开始就可以进行导航单击。
如何实现这一目标?
Update:
我尝试过 Javascript 插件(绿色音频播放器)。播放器显示如下:
有Infinity
出现。所以我猜测文件长度不是由服务器发送的。这很奇怪,因为文件是直接链接的(文件系统位置)。
响应标头如下所示(对于 25 秒文件):
我的 Apache 服务器回复状态代码200
对于第一次加载。当点击视频播放栏时,它会执行206 Partial content
要求如所须 https://developer.mozilla.org/en-US/docs/Web/HTTP/Configuring_servers_for_Ogg_media。但是,当单击 Chrome 中的音频播放栏时,不会发生这种情况。没有发送请求。
相反,它发送Accept-Ranges: bytes
这应该能够通过文件进行搜索:
Accept-Ranges 标头指示服务器接受对资源的范围请求。远程 Web 服务器使用的单位是字节。该标头告诉我们服务器支持恢复下载或下载文件。
我认为解决这个问题的一种方法是always提供 OGG 文件206 Partial content
,已经有了第一个请求。但我还不知道如何在 Apache 服务器中启用此功能。
Notes:
我读到 Apache 确实如此206
默认情况下,但如果启用缓存/GZIP,则不会。所以我禁用了缓存htaccess
(SetEnvIfNoCase Request_URI . (?:mp4|mp3|ogg|webm)$ no-gzip dont-vary
)但它仍然不起作用。
Update:
我尝试使用另一个 OGG 文件(test.ogg)。这个可以用游戏杆玩耍和跳跃,没有任何问题!
我正在使用的 OGG 文件是通过在浏览器端记录它们来创建的(Javascriptnew MediaRecorder(stream);
),然后发送到服务器并由PHP存储为OGG文件。
查看示例文件的文件属性:
查看test.ogg文件的文件属性:
显然,有问题的文件缺少元数据!
跟进:如何在 PHP 中将 MediaRecorder 流保存到 OGG 文件?包括元数据 https://stackoverflow.com/questions/67041475/how-to-save-mediarecorder-stream-to-ogg-file-in-php-including-metadata