Javascript 可以为HTML5视频源在JS中生成比特流吗?

Javascript 可以为HTML5视频源在JS中生成比特流吗?,javascript,html,video,Javascript,Html,Video,我想用JavaScript动态生成一个比特流,例如一个大型OGG视频。 是否可以告诉浏览器为比特流请求JavaScript函数,而不是向某个位置发出HTTP GET请求 我发现,向视频标签提供数据的唯一可能方法是包含数据:-URL。但这需要将整个视频编码到文档中 这对于通常是流式播放的大型视频来说是一个糟糕的解决方案。很抱歉,您无法将更多数据动态添加到数据URL 有人知道这是否可能吗?如果您的视频编码为流式传输,则无论浏览器请求什么,它都会被逐步下载。这就是它的工作原理。您将需要同时使用OGG和

我想用JavaScript动态生成一个比特流,例如一个大型OGG视频。 是否可以告诉浏览器为比特流请求JavaScript函数,而不是向某个位置发出HTTP GET请求

我发现,向视频标签提供数据的唯一可能方法是包含数据:-URL。但这需要将整个视频编码到文档中

这对于通常是流式播放的大型视频来说是一个糟糕的解决方案。很抱歉,您无法将更多数据动态添加到数据URL


有人知道这是否可能吗?

如果您的视频编码为流式传输,则无论浏览器请求什么,它都会被逐步下载。这就是它的工作原理。您将需要同时使用OGG和MP4

FF/Chrome/IE9


“在文档上编码”没有任何意义。视频由编码器进行编码,并且可以进一步设置以优化流式传输(即,它以较低的比特率对前XX秒进行编码,以更快地开始)

我不知道使用Javascript是否可行,但您可能可以使用Java或Javascript(?)播放器(如Cortado)执行类似操作


现在,这应该可以通过

下面是上面链接中的一个示例:

var video = document.querySelector('video');

var assetURL = 'frag_bunny.mp4';
// Need to be specific for Blink regarding codecs
// ./mp4info frag_bunny.mp4 | grep Codec
var mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';

if ('MediaSource' in window && MediaSource.isTypeSupported(mimeCodec)) {
  var mediaSource = new MediaSource();
  //console.log(mediaSource.readyState); // closed
  video.src = URL.createObjectURL(mediaSource);
  mediaSource.addEventListener('sourceopen', sourceOpen);
} else {
  console.error('Unsupported MIME type or codec: ', mimeCodec);
}

function sourceOpen (_) {
  //console.log(this.readyState); // open
  var mediaSource = this;
  var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
  fetchAB(assetURL, function (buf) {
    sourceBuffer.addEventListener('updateend', function (_) {
      mediaSource.endOfStream();
      video.play();
      //console.log(mediaSource.readyState); // ended
    });
    sourceBuffer.appendBuffer(buf);
  });
};

function fetchAB (url, cb) {
  console.log(url);
  var xhr = new XMLHttpRequest;
  xhr.open('get', url);
  xhr.responseType = 'arraybuffer';
  xhr.onload = function () {
    cb(xhr.response);
  };
  xhr.send();
};

谢谢,这很有用。我在某处看到一个JavaScript解码器,它在画布上绘制帧。这显然没有那么快,也没有声音。但这只是一个解决办法。例如,Cortado需要Java。你的意思是像在img标记中一样使用“数据:字符串”吗?()