8

背景:

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

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

  • 我正在选择一个内置在笔记本电脑中的俗气的网络摄像头作为视频源。它被称为DMAX-AVC制造的“EasyCamera”。将其称为 CheezyCamera 很诱人。

视频流生成得很好。

问题:

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

当然,网络摄像头、gUM 和 MediaRecorder 将约束参数视为建议,并且可以自由地以不同的方式响应。在这种情况下,当我请求 352x288 时,它们会以 440x360 响应。该系统按设计运行;那不是我的问题。

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

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

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

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

我的问题:

<video>网络摄像头 / gUM / MediaRecorder /信号链中是否有任何方法可以在实际记录流的浏览器中找到编码流的实际尺寸?也就是说,我可以在不解码生成的流的情况下找到信号链对我请求的维度的响应吗?

4

3 回答 3

1

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

我得出结论,这是从 Google Chrome 到 gUM 的信号链网络摄像头某处的错误。

于 2019-02-02T17:43:46.060 回答
1

使用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);
});
于 2019-01-27T19:43:28.170 回答
1

您可能需要像在此测试exact中一样使用约束关键字

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};

这不能保证 WebCam 将以该分辨率进行流式传输,但如果生成的与请求的不同,VideoTrackAdapter将参与为您(和 MediaRecorder)进行调整。

于 2019-01-29T14:17:55.950 回答