背景:
在Windows 10我用getUserMedia(胶)和MediaRecorder谷歌浏览器(V71),以采集和编码的视频流。
video/webm; codecs="avc1.42E01E"
作为MIME类型的编码流的(这是H.264盒装在Matroska)。视频流获取生成就好了。
问题:
流中的编码视频的尺寸是440x360,而不是我要求的352×288。此信息嵌入记录流中,并从该数据的消费者才可见。在各种API的应用揭示了胶物流,MediaRecorder和<video>
要素元都认为尺寸是我要求的人。
当然,网络摄像头,口香糖和MediaRecorder对待约束参数作为建议,可以自由地与不同的东西做出反应。在这种情况下,他们与440x360回应时,我要求352×288。该系统的功能设计;那不是我的问题。
为了澄清,意想不到的440x360尺寸只能记录流的消费者是可见的。我希望能找到一个办法知道制片方的摄像头,胶,而且比我要求MediaEncoder信号链产生不同的分辨率。
如何流消费者知道流尺寸是多少?他们是在“PixelWidth”和“PixelHeight” Matroska的箱子,而且他们中的H.264码流出炉。 (奇怪的是,考虑到这是一个软件选择的分辨率,它不是16×16的宏块的整数倍。它仍然工程当然)。
因为它保存在不透明的斑点,我不能在浏览器解析记录的数据。
当我使用一个不同的,更好的,网络摄像头(罗技C615)我的视频编码流是我要求的尺寸。
我的问题:
是否有摄像头/口香糖/ MediaRecorder / <video>
信号链中的任何方式找到编码流的浏览器在实际拍摄流的实际尺寸是多少?也就是说,我能找到不产生流解码信号链中对我的请求的维度回应?
使用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);
});
您可能需要使用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)。
尝试过这个问题的应答者等提供的各种事情之后,我还没有成功地解决了这个问题。
我断定它在信号链的摄像头,谷歌浏览器胶某处的错误。