【问题标题】:Appending getusermedia data to mediasource将 getusermedia 数据附加到 mediasource
【发布时间】:2016-03-19 23:28:57
【问题描述】:

我对媒体流和媒体源 API 的经验有限,您认为从 getusermedia 获取数据然后将该数据附加到媒体源的最佳方法是什么。现在我正在使用 MediaRecorder 记录数据,然后将其附加到新的 mediasource 对象上。但它只是返回一个空白视频。这是我目前正在做的事情。

function createElem (tagName) {
  var elem = document.createElement(tagName)
  elem.controls = true
  elem.autoplay = true 
  elem.play() 
  document.body.appendChild(elem)
  return elem
}

navigator.getUserMedia({ video: true, audio: false }, function (stream) {
  var recorder = new MediaRecorder(stream)
  var wrapper = new MediaSource()

  var elem = createElem('video')
  elem.src = window.URL.createObjectURL(wrapper)
  wrapper.addEventListener('sourceopen', sourceOpen)

  function sourceOpen () {
    var source = wrapper.addSourceBuffer('video/webm;codecs=vp9')
    recorder.ondataavailable = function (e) {
      source.appendBuffer(new Uint8Array(e.data))
    }
  }
  recorder.start(1000)
}, function () {})

我知道你可以使用video.src = window.URL.createObjectURL(stream),但我想处理原始数据。是否可以这样做。这是一个小提琴,所以你可以玩it

【问题讨论】:

    标签: javascript video-streaming getusermedia mediastreamsource


    【解决方案1】:

    我遇到了类似的问题,this answer 为我工作。
    我猜问题是 MediaRecorder API 返回一个Blob,但需要一个 ArrayBuffer。根据the MDN documentation:“从Blob 读取内容的唯一方法是使用FileReader”。

    我改编了你的fiddle,但我只在 Chrome 53 中测试过。

    navigator.getUserMedia({ video: true, audio: false }, successCallback, function (err) { console.error('Error:', err, err.stack); })
    
    function successCallback(stream) {
        var recorder, source = new MediaSource()
    
        var elem = createVideoElem()
        elem.src = URL.createObjectURL(source)  
        source.addEventListener('sourceopen', sourceOpen)
    
        function sourceOpen () {
            var buffer = source.addSourceBuffer('video/webm;codecs=vp9')
            recorder = new MediaRecorder(stream)
            recorder.start(1000)
    
            recorder.ondataavailable = function (e) {
                var fileReader = new FileReader();
                fileReader.onload = function() {
                    buffer.appendBuffer(fileReader.result);
                };
                fileReader.readAsArrayBuffer(e.data);
            }
        }
    }
    
    function createVideoElem () {
        var elem = document.createElement('video')
        elem.controls = true
        elem.autoplay = true // for chrome
        elem.play() // for firefox
        document.body.appendChild(elem)
        return elem
    }
    

    【讨论】:

      【解决方案2】:

      这是我的工作演示。即使我在很多天都在与这个 mimeTypes 苦苦挣扎,最后我的代码正在工作 demo

      var mediasource = new MediaSource(),video = document.querySelector("video"),
          mime = 'video/webm;codecs=vp9,opus'
      video.src = URL.createObjectURL(mediasource)
      
      mediasource.addEventListener("sourceopen",function(_){
          var source = mediasource.addSourceBuffer(mime)
          navigator.mediaDevices.getUserMedia({video: true,audio: true}).then(stream=>{
              var recorder = new MediaRecorder(stream,{mimeType:mime})
              recorder.ondataavailable = d =>{
                  var r = new Response(d.data).arrayBuffer() // convert blob to arraybuffer
                  r.then(arraybuffer=>{
                      source.appendBuffer(arraybuffer)
                  })
              }
              recorder.start(5000)
          })
      })
      

      【讨论】:

      • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
      猜你喜欢
      • 1970-01-01
      • 2019-01-02
      • 2016-03-07
      • 2019-06-16
      • 2023-03-05
      • 2017-09-22
      • 2023-04-03
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多