将 MediaRecorder 与 start 指定的时间片参数一起使用的正确方法
Correct way to use MediaRecorder with a time slice argument specified with start
阅读此页后https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder.start,我已经编写了自己的代码:
var mediaConstraint = { video: true, audio: true };
navigator.getUserMedia(mediaConstraint, function(stream) {
var vendorURL = window.URL || window.webkitURL;
_video = document.querySelector('#recordingCamera');
_video.src = vendorURL.createObjectURL(stream);
_video.play();
var mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start(3000);
mediaRecorder.ondataavailable = function(e) {
var replay = document.querySelector('#replay');
replay.src = window.URL.createObjectURL(e.data);
replay.play();
}
}, function(error){
});
我希望在 #recordingCamera 元素显示我相机的内容 3 秒后,我会在 #replay 元素中看到内容重播。
但是 #replay 元素只播放了前 3 秒。之后,#recordingCamera 元素仍会显示摄像机内容,但不会显示 #replay 元素的其他内容。
检查控制台时,我发现了这些消息:
Media resource blob:http://localhost:8081/634f6237-17a9-475d-89bb-2c6ca0b48eb6 could not be decoded.
Media resource blob:http://localhost:8081/d0b95463-f9bc-4b0f-bd0d-40ae3152181f could not be decoded.
Media resource blob:http://localhost:8081/535ab990-0ee2-4ec0-adac-2d5d6917f6f3 could not be decoded.
ondataavailable 仍然触发,但数据出现错误。
我的问题:
- 这是 Firefox 的错误吗?
- 如果不是,正确的使用方法是什么
具有由 start 指定的时间片参数的 MediaRecorder?
好的,我找到了解决方案,MediaSource API
var mediaSource = new MediaSource();
var replay = document.querySelector('#replay');
replay.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', function(e) {
console.log('sourceopen')
sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vorbis,vp8"');
});
var mediaConstraint = { video: true, audio: true };
navigator.getUserMedia(mediaConstraint, function(stream) {
var mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start(3000);
mediaRecorder.ondataavailable = function(e) {
var fileReader = new FileReader();
fileReader.onload = function() {
sourceBuffer.appendBuffer(fileReader.result);
};
fileReader.readAsArrayBuffer(e.data);
}
}, function(error){});
请注意,在 Firefox 中,您需要将 enable-media-source 标志设置为 true。
这似乎是 Firefox 中的错误。如果您使用较小的时间片间隔调用 mediaRecorder.start
,则 blob 将在不使用 MediaSource 的情况下正常播放。 Note that MediaSource was not generally available until Firefox 42,因此您不能指望它可用。
mediaRecorder.start(1000);
阅读此页后https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder.start,我已经编写了自己的代码:
var mediaConstraint = { video: true, audio: true };
navigator.getUserMedia(mediaConstraint, function(stream) {
var vendorURL = window.URL || window.webkitURL;
_video = document.querySelector('#recordingCamera');
_video.src = vendorURL.createObjectURL(stream);
_video.play();
var mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start(3000);
mediaRecorder.ondataavailable = function(e) {
var replay = document.querySelector('#replay');
replay.src = window.URL.createObjectURL(e.data);
replay.play();
}
}, function(error){
});
我希望在 #recordingCamera 元素显示我相机的内容 3 秒后,我会在 #replay 元素中看到内容重播。
但是 #replay 元素只播放了前 3 秒。之后,#recordingCamera 元素仍会显示摄像机内容,但不会显示 #replay 元素的其他内容。
检查控制台时,我发现了这些消息:
Media resource blob:http://localhost:8081/634f6237-17a9-475d-89bb-2c6ca0b48eb6 could not be decoded.
Media resource blob:http://localhost:8081/d0b95463-f9bc-4b0f-bd0d-40ae3152181f could not be decoded.
Media resource blob:http://localhost:8081/535ab990-0ee2-4ec0-adac-2d5d6917f6f3 could not be decoded.
ondataavailable 仍然触发,但数据出现错误。
我的问题:
- 这是 Firefox 的错误吗?
- 如果不是,正确的使用方法是什么 具有由 start 指定的时间片参数的 MediaRecorder?
好的,我找到了解决方案,MediaSource API
var mediaSource = new MediaSource();
var replay = document.querySelector('#replay');
replay.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', function(e) {
console.log('sourceopen')
sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vorbis,vp8"');
});
var mediaConstraint = { video: true, audio: true };
navigator.getUserMedia(mediaConstraint, function(stream) {
var mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start(3000);
mediaRecorder.ondataavailable = function(e) {
var fileReader = new FileReader();
fileReader.onload = function() {
sourceBuffer.appendBuffer(fileReader.result);
};
fileReader.readAsArrayBuffer(e.data);
}
}, function(error){});
请注意,在 Firefox 中,您需要将 enable-media-source 标志设置为 true。
这似乎是 Firefox 中的错误。如果您使用较小的时间片间隔调用 mediaRecorder.start
,则 blob 将在不使用 MediaSource 的情况下正常播放。 Note that MediaSource was not generally available until Firefox 42,因此您不能指望它可用。
mediaRecorder.start(1000);