Добавление данных getusermedia в медиаресурс
У меня ограниченный опыт работы с mediastream и mediasource apis. Что, по вашему мнению, является наилучшим способом получения данных из getusermedia и последующего добавления этих данных в mediaasource? Прямо сейчас я использую MediaRecorder для записи данных, а затем добавляю их в новый объект медиаресурса. Но он просто возвращает пустое видео. Вот что я сейчас делаю.
function createElem (tagName) {
var elem = document.createElement(tagName)
elem.controls = true
elem.autoplay = true
elem.play()
document.body.appendChild(elem)
return elem
}
navigator.getUserMedia({ video: true, audio: false }, function (stream) {
var recorder = new MediaRecorder(stream)
var wrapper = new MediaSource()
var elem = createElem('video')
elem.src = window.URL.createObjectURL(wrapper)
wrapper.addEventListener('sourceopen', sourceOpen)
function sourceOpen () {
var source = wrapper.addSourceBuffer('video/webm;codecs=vp9')
recorder.ondataavailable = function (e) {
source.appendBuffer(new Uint8Array(e.data))
}
}
recorder.start(1000)
}, function () {})
Я знаю, что вы можете просто использовать video.src = window.URL.createObjectURL(stream)
но я хотел бы обработать необработанные данные. Возможно ли сделать это таким образом. Вот скрипка, так что вы можете поиграть с ней.
2 ответа
У меня была похожая проблема, и этот ответ сработал для меня.
Я предполагаю, что проблема в том, что MediaRecorder API возвращает Blob, но необходим ArrayBuffer. Согласно документации MDN: "Единственный способ читать содержимое из BLOB-объекта - это использовать FileReader".
Я адаптировал вашу скрипку, но протестировал ее только в Chrome 53.
navigator.getUserMedia({ video: true, audio: false }, successCallback, function (err) { console.error('Error:', err, err.stack); })
function successCallback(stream) {
var recorder, source = new MediaSource()
var elem = createVideoElem()
elem.src = URL.createObjectURL(source)
source.addEventListener('sourceopen', sourceOpen)
function sourceOpen () {
var buffer = source.addSourceBuffer('video/webm;codecs=vp9')
recorder = new MediaRecorder(stream)
recorder.start(1000)
recorder.ondataavailable = function (e) {
var fileReader = new FileReader();
fileReader.onload = function() {
buffer.appendBuffer(fileReader.result);
};
fileReader.readAsArrayBuffer(e.data);
}
}
}
function createVideoElem () {
var elem = document.createElement('video')
elem.controls = true
elem.autoplay = true // for chrome
elem.play() // for firefox
document.body.appendChild(elem)
return elem
}
вот моя рабочая демонстрация. даже я много дней боролся с этим mimeTypes, наконец, мой код работает демо
enter code here