Jus*_*tin 5 html audio audio-streaming html5-audio
如何让 HTML5 音频元素立即开始播放低比特率音频流?
有关问题的现场示例,请访问此网页。
我正在将低比特率的 ogg/opus 流式传输到 HTML5 音频元素。除了一个问题外,它运行良好。
在我测试过的两个浏览器(Chrome 和 Firefox)上,浏览器会缓冲直到收到 32 kB 的数据。这可以是音频文件中 20-40 秒的任何位置。
当命中 ~32 kB 时,浏览器将触发loadeddata事件和 a readyStateof 3,紧接着是canplay事件。
示例代码:
<audio id="test" controls="controls" autoplay>
<source src="https://SCRIPT" type="audio/ogg; codecs=opus"/>
</audio>
<script>
var obj = document.getElementById('test');
obj.addEventListener('canplay', function() {
console.log("Can play event");
});
obj.addEventListener('canplaythrough', function() {
console.log("can play through event");
});
obj.addEventListener('loadeddata', function() {
console.log("Loaded data event");
console.log(obj.readyState);
});
</script>
Run Code Online (Sandbox Code Playgroud)
我尝试“ping”它,.play()但没有成功。
当加入至少一分钟的流时(服务器可以立即提供大量数据),音频基本上立即开始播放。问题是当流是新的(即刚刚创建)并且没有足够的数据来触发看似任意的播放点时,因为应用程序应该是低开销的。
这种延迟水平是不可接受的,坦率地说,这确实令人困惑。为什么与要求更高的流相比,您延迟开销较低的流的时间更长?这与人们认为的常识相反。
我有更复杂的解决方法,但最好使用广泛使用的 HTML5 音频来完成这项工作。
.play()即使readyState是0或在canplay事件发生之前?我在audio.readyStateChrome 允许的情况下尽可能频繁地记录,并发现它在触发前几毫秒从0("HAVE_NOTHING") 变为1(HAVE_METADATA) loadeddata。正如我之前提到的,它更改为3("HAVE_FUTURE_DATA") 并带有loadeddata.
这是 Chrome 的日志示例,末尾的整数是 readyState
12:49:36.199 StreamTest.php:94 0(页面加载)
...(打印“0”) ...
12:49:54.497 StreamTest.php:94 0
12:49:54.503 StreamTest.php:94 1
12:49:54.505 StreamTest.php:74 加载数据事件
12:49:54.505 StreamTest.php:75 3
12:49:54.505 StreamTest.php:66 可以播放事件
更新 2
这些是流标头:
HTTP/1.0 200 OK
Date: Sun, 25 Mar 2018 08:54:07 GMT
Server: Apache
Accept-Ranges: none
Cache-Control: max-age=0, no-cache, no-store, must-revalidate
Pragma: no-cache
Connection: close
Expires: Wed, 11 Jan 1984 05:00:00 GMT
X-Frame-Options: sameorigin
Content-Type: audio/ogg; codecs=opus
Run Code Online (Sandbox Code Playgroud)
更新 3
我创建了一个包含一些测试的测试页面来演示 HTML5 音频播放行为。请参阅此网页:http : //webtests.online/LiveHTML5Audio.php
| 归档时间: |
|
| 查看次数: |
1183 次 |
| 最近记录: |