代码之家  ›  专栏  ›  技术社区  ›  O. Jones

传输的getUserMedia/MediaRecorder视频格式大于请求的格式。怎么说?

  •  7
  • O. Jones  · 技术社区  · 7 年前

    背景:

    在Windows 10上,我正在使用 getUserMedia MediaRecorder 在Google Chrome(v71)中捕获和编码视频流。

    • 我用约束参数来告诉它我想要一个352x288的视频格式。
    • video/webm; codecs="avc1.42E01E" 作为编码流的MIME类型(即H.264中的 Matroska

    • 我选择了一个内置在笔记本电脑中的廉价网络摄像头作为视频源。它被称为“EasyCamera”,由DMAX-AVC制造。这很容易被称为CheezyCamera。

    视频流生成得很好。

    流中编码视频的尺寸如下所示: 而不是我的要求 352x288 . 该信息嵌入到记录的流中,并且仅从该数据的使用者处可见。各种API的使用揭示了gUM流、MediaRecorder和 <video> 元素元数据都认为维度是我要求的。

    当然,webcam、gUM和MediaRecorder将约束参数视为建议,并可以自由地使用不同的内容进行响应。在这种情况下,当我请求352x288时,他们以440x360响应。该系统功能符合设计要求;那不是我的问题。

    为了澄清,意外的440x360尺寸仅对记录流的使用者可见。我希望找到一种方法来了解生产方网络摄像头、gUM和MediaEncoder信号链产生的分辨率与我要求的不同。

    流消费者如何知道流维度?它们在“PixelWidth”和“PixelHeight”Matroska框中,它们被烘焙到H.264流中。(奇怪的是,考虑到这是软件选择的分辨率,它不是16x16宏块的整数。当然,它仍然有效。)

    我无法在浏览器中解析记录的数据,因为它存储在不透明的blob中。

    当我使用不同的、更好的网络摄像头(Logitech C615)时,我的编码视频流就是我要求的大小。

    我的问题:

    网络摄像头/口香糖/媒体录像机有什么办法吗/ < 信号链找到了 对我 没有解码生成流的维度?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Munim Munna    7 年前

    使用 MediaStream.getVideoTracks() 获取视频轨迹的方法( MediaStreamTrack ),然后使用 MediaStreamTrack.getSettings() 得到 MediaTrackSettings

    因此,如果我请求一个高度为0的视频,并将其指定为约束,那么我会得到一个高度为1像素的视频。流式传输时,我们可以检索我请求的高度和作为输出获取的高度。

    function handleMediaStream(mystream){
      let videoStreamTrack = mystream.getVideoTracks()[0];
      let constraints = videoStreamTrack.getConstraints();
      console.log(constraints.width, constraints.height);
      // outputs: 640 0
      let settings = videoStreamTrack.getSettings();
      console.log(settings.width, settings.height);
      // outputs: 640 1
    }
    
    let videoConstraints = { width: 640, height: 0 }
    navigator.mediaDevices.getUserMedia({ video: videoConstraints })
    .then(function create_media_recorder(mystream) {
      handleMediaStream(mystream);
    });
    
        2
  •  1
  •   miguelao    7 年前

    您可能需要使用 exact 约束关键字类似于 this test

    const sdPalConstraints = {
      video: {width: {exact: 352}, height: {exact: 288}}
    };
    // Assuming |video| exists and represents a <video> element.
    navigator.mediaDevices.getUserMedia(sdPalConstraints)
                          .then(stream) => {video.srcObject = stream};
    

    VideoTrackAdapter 将为您(以及MediaRecorder)进行调整。

        3
  •  1
  •   O. Jones    7 年前

    在尝试了其他回答这个问题的人提供的各种方法之后,我没有成功地解决这个问题。

    推荐文章