所有我都在使用 webRTC 进行点对点通信,我们有来自 getUserMedia 的媒体流对象,它作为输入流提供给对等连接。在这里,我需要来自本地驱动器中使用 HTML5 的视频元素播放的所选视频文件的视频流。是否可以从视频标签创建媒体流对象?
谢谢,苏里
现在你不能从视频标签中添加媒体流,但将来应该可以,正如MDN上所解释的那样
MediaStream 对象有一个输入和一个输出。由 getUserMedia() 生成的 MediaStream 对象称为本地对象,其源输入是用户的相机或麦克风之一。非本地 MediaStream 可以表示媒体元素,如或,源自网络并通过 WebRTC PeerConnection API 获得的流,或使用 Web 音频 API MediaStreamAudioSourceNode 创建的流。
但是您可以使用Media Source Extensions API来做您想做的事情:您必须将本地文件放入流中并附加到 MediaSource 对象中。您可以在此处了解有关 MSE 的更多信息:http: //www.w3.org/TR/media-source/
您可以在此处找到上述方法的演示和来源
2021 年更新:现在可以使用 MediaRecorder 接口:https ://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder
来自同一页面的示例:
if (navigator.mediaDevices) {
console.log('getUserMedia supported.');
var constraints = { audio: true };
var chunks = [];
navigator.mediaDevices.getUserMedia(constraints)
.then(function(stream) {
var mediaRecorder = new MediaRecorder(stream);
visualize(stream);
record.onclick = function() {
mediaRecorder.start();
console.log(mediaRecorder.state);
console.log("recorder started");
record.style.background = "red";
record.style.color = "black";
}
stop.onclick = function() {
mediaRecorder.stop();
console.log(mediaRecorder.state);
console.log("recorder stopped");
record.style.background = "";
record.style.color = "";
}
mediaRecorder.onstop = function(e) {
console.log("data available after MediaRecorder.stop() called.");
var clipName = prompt('Enter a name for your sound clip');
var clipContainer = document.createElement('article');
var clipLabel = document.createElement('p');
var audio = document.createElement('audio');
var deleteButton = document.createElement('button');
clipContainer.classList.add('clip');
audio.setAttribute('controls', '');
deleteButton.innerHTML = "Delete";
clipLabel.innerHTML = clipName;
clipContainer.appendChild(audio);
clipContainer.appendChild(clipLabel);
clipContainer.appendChild(deleteButton);
soundClips.appendChild(clipContainer);
audio.controls = true;
var blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });
chunks = [];
var audioURL = URL.createObjectURL(blob);
audio.src = audioURL;
console.log("recorder stopped");
deleteButton.onclick = function(e) {
evtTgt = e.target;
evtTgt.parentNode.parentNode.removeChild(evtTgt.parentNode);
}
}
mediaRecorder.ondataavailable = function(e) {
chunks.push(e.data);
}
})
.catch(function(err) {
console.log('The following error occurred: ' + err);
})
}
MDN 也有详细的迷你教程:https ://developer.mozilla.org/en-US/docs/Web/API/MediaStream_Recording_API/Recording_a_media_element