javascript – HTML5视频:使用Blob网址流式传输视频
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – HTML5视频:使用Blob网址流式传输视频,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3649字,纯文字阅读大概需要6分钟。
内容图文
我有一个Blob数组(二进制数据,真的 – 我可以表达它然而效率最高.我现在使用Blob但可能是Uint8Array或者更好的东西).每个Blob包含1秒的音频/视频数据.每秒生成一个新的Blob并附加到我的数组.因此代码大致如此:
var arrayOfBlobs = [];
setInterval(function() {
arrayOfBlobs.append(nextChunk());
}, 1000);
我的目标是将此音频/视频数据流式传输到HTML5元素.我知道可以生成和播放Blob URL,如下所示:
var src = URL.createObjectURL(arrayOfBlobs[0]);
var video = document.getElementsByTagName("video")[0];
video.src = src;
当然,这仅播放视频的前1秒.我还假设我可以简单地连接当前在我的数组中的所有Blob以某种方式播放超过一秒:
// Something like this (untested)
var concatenatedBlob = new Blob(arrayOfBlobs);
var src = ...
然而,这仍将最终耗尽数据.由于Blob是不可变的,我不知道如何继续附加数据.
我确信这应该是可能的,因为YouTube和许多其他视频流服务都使用Blob URL进行视频播放.他们是如何做到的呢?
解决方法:
解
经过一些重要的谷歌搜索后,我设法找到了拼图中缺失的部分:MediaSource
这个过程实际上是这样的:
>创建MediaSource
>从MediaSource创建对象URL
>将视频的src设置为对象URL
>在sourceopen事件上,创建一个SourceBuffer
>使用SourceBuffer.appendBuffer()将所有块添加到视频中
这样,您可以在不更改对象URL的情况下继续添加新的视频位.
注意事项
> SourceBuffer对象对编解码器非常挑剔.这些必须被声明,并且必须准确,否则将无效
>您一次只能将一个blob的视频数据附加到SourceBuffer,并且在第一个Blob完成(异步)处理之前,您不能追加第二个blob
>如果你在没有调用.remove()的情况下向SourceBuffer添加太多数据,那么你最终将耗尽RAM并且视频将停止播放.我的笔记本电脑在1小时左右就达到了这个极限
示例代码
根据您的设置,其中一些可能是不必要的(特别是在我们拥有SourceBuffer然后使用updateend缓慢附加我们的队列之前构建视频数据队列的部分).如果您能够等到创建SourceBuffer以开始抓取视频数据,那么您的代码看起来会更好.
<html>
<head>
</head>
<body>
<video id="video"></video>
<script>
// As before, I'm regularly grabbing blobs of video data
// The implementation of "nextChunk" could be various things:
// - reading from a MediaRecorder
// - reading from an XMLHttpRequest
// - reading from a local webcam
// - generating the files on the fly in JavaScript
// - etc
var arrayOfBlobs = [];
setInterval(function() {
arrayOfBlobs.append(nextChunk());
// NEW: Try to flush our queue of video data to the video element
appendToSourceBuffer();
}, 1000);
// 1. Create a `MediaSource`
var mediaSource = new MediaSource();
// 2. Create an object URL from the `MediaSource`
var url = URL.createObjectURL(mediaSource);
// 3. Set the video's `src` to the object URL
var video = document.getElementById("video");
video.src = url;
// 4. On the `sourceopen` event, create a `SourceBuffer`
var sourceBuffer = null;
mediaSource.addEventListener("sourceopen", function()
{
// NOTE: Browsers are VERY picky about the codec being EXACTLY
// right here. Make sure you know which codecs you're using!
sourceBuffer = mediaSource.addSourceBuffer("video/webm; codecs=\"opus,vp8\"");
// If we requested any video data prior to setting up the SourceBuffer,
// we want to make sure we only append one blob at a time
sourceBuffer.addEventListener("updateend", appendToSourceBuffer);
});
// 5. Use `SourceBuffer.appendBuffer()` to add all of your chunks to the video
function appendToSourceBuffer()
{
if (
mediaSource.readyState === "open" &&
sourceBuffer &&
sourceBuffer.updating === false
)
{
sourceBuffer.appendBuffer(arrayOfBlobs.shift());
}
// Limit the total buffer size to 20 minutes
// This way we don't run out of RAM
if (
video.buffered.length &&
video.buffered.end(0) - video.buffered.start(0) > 1200
)
{
sourceBuffer.remove(0, video.buffered.end(0) - 1200)
}
}
</script>
</body>
</html>
作为额外的奖励,这会自动为您提供实时流的DVR功能,因为您在缓冲区中保留了20分钟的视频数据(您可以通过简单地使用video.currentTime = …进行搜索)
内容总结
以上是互联网集市为您收集整理的javascript – HTML5视频:使用Blob网址流式传输视频全部内容,希望文章能够帮你解决javascript – HTML5视频:使用Blob网址流式传输视频所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。