- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正在使用 webrtc 录制视频,并将每 10 秒的视频作为 blob 发送到服务器,所有 10 秒的文件都保存在服务器上,到目前为止一切都很好,但唯一的问题是只有第一个视频文件播放为视频其余其他文件无法播放,因为它缺少编解码器和 MIMEType。请帮助我如何使用 mimetype 和 wit 编解码器 vp9 发送每 10 秒的 blob
// This code is adapted from
// https://rawgit.com/Miguelao/demos/master/mediarecorder.html
'use strict';
/* globals MediaRecorder */
const mediaSource = new MediaSource();
mediaSource.addEventListener('sourceopen', handleSourceOpen, false);
let mediaRecorder;
let recordedBlobs;
let sourceBuffer;
const errorMsgElement = document.querySelector('span#errorMsg');
const recordedVideo = document.querySelector('video#recorded');
const recordButton = document.querySelector('button#record');
recordButton.addEventListener('click', () => {
if (recordButton.textContent === 'Start Recording') {
startRecording();
} else {
stopRecording();
recordButton.textContent = 'Start Recording';
playButton.disabled = false;
downloadButton.disabled = false;
}
});
const playButton = document.querySelector('button#play');
playButton.addEventListener('click', () => {
const superBuffer = new Blob(recordedBlobs, {type: 'video/webm'});
recordedVideo.src = null;
recordedVideo.srcObject = null;
recordedVideo.src = window.URL.createObjectURL(superBuffer);
recordedVideo.controls = true;
recordedVideo.play();
console.log('start- display recordedblob');
console.log(recordedVideo);
console.log('end- display recordedblob');
});
const downloadButton = document.querySelector('button#download');
downloadButton.addEventListener('click', () => {
const blob = new Blob(recordedBlobs, {type: 'video/webm'});
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = 'test.webm';
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 100);
});
function handleSourceOpen(event) {
console.log('MediaSource opened');
sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vp8"');
console.log('Source buffer: ', sourceBuffer);
}
function handleDataAvailable(event) {
console.log('handleDataAvailable', event);
console.log('shree sai baba', event.data);
if (event.data && event.data.size > 0) {
recordedBlobs.push(event.data);
console.log('heyy'+recordedBlobs);
// to save video as each blob
var formData = new FormData();
formData.append('video', event.data);
console.log('result blob which am trying to send to server', event.data);
// Execute the ajax request, in this case we have a very simple PHP script
// that accepts and save the uploaded "video" file
xhr('/webcam/', formData, function (fName) {
console.log("video successfully uploaded !");
});
// Helper function to send
function xhr(url, data, callback) {
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState == 4 && request.status == 200) {
callback(location.href + request.responseText);
}
};
request.open('POST', url);
request.send(data);
console.log(data);
console.log('logg')
console.log(request.response);
}
console.log('10 seconds video sent to the server');
// end of save video as each
}
}
function startRecording() {
recordedBlobs = [];
let options = {mimeType: 'video/webm;codecs=vp9'};
if (!MediaRecorder.isTypeSupported(options.mimeType)) {
console.error(`${options.mimeType} is not Supported`);
errorMsgElement.innerHTML = `${options.mimeType} is not Supported`;
options = {mimeType: 'video/webm;codecs=vp8'};
if (!MediaRecorder.isTypeSupported(options.mimeType)) {
console.error(`${options.mimeType} is not Supported`);
errorMsgElement.innerHTML = `${options.mimeType} is not Supported`;
options = {mimeType: 'video/webm'};
if (!MediaRecorder.isTypeSupported(options.mimeType)) {
console.error(`${options.mimeType} is not Supported`);
errorMsgElement.innerHTML = `${options.mimeType} is not Supported`;
options = {mimeType: ''};
}
}
}
try {
mediaRecorder = new MediaRecorder(window.stream, options);
} catch (e) {
console.error('Exception while creating MediaRecorder:', e);
errorMsgElement.innerHTML = `Exception while creating MediaRecorder: ${JSON.stringify(e)}`;
return;
}
console.log('Created MediaRecorder', mediaRecorder, 'with options', options);
recordButton.textContent = 'Stop Recording';
playButton.disabled = true;
downloadButton.disabled = true;
mediaRecorder.onstop = (event) => {
console.log('Recorder stopped: ', event);
console.log('naduuuuuuuuuuuuuuuuuuuuzz');
console.log('Recorded Blobss: ', recordedBlobs);
console.log('ans', recordedBlobs);
// console.log(Blob.arrayBuffer())
console.log('Recorded Blobss: ', recordedBlobs.type);
console.log('naduuuuuuuuuuuuuuuuuuuu');
};
mediaRecorder.ondataavailable = handleDataAvailable;
mediaRecorder.start(10000); // collect 10s of data
console.log('MediaRecorder started', mediaRecorder);
}
function stopRecording() {
mediaRecorder.stop();
}
function handleSuccess(stream) {
recordButton.disabled = false;
console.log('getUserMedia() got stream:', stream);
window.stream = stream;
const gumVideo = document.querySelector('video#gum');
gumVideo.srcObject = stream;
}
async function init(constraints) {
try {
const stream = await navigator.mediaDevices.getUserMedia(constraints);
handleSuccess(stream);
} catch (e) {
console.error('navigator.getUserMedia error:', e);
errorMsgElement.innerHTML = `navigator.getUserMedia error:${e.toString()}`;
}
}
document.querySelector('button#start').addEventListener('click', async () => {
const hasEchoCancellation = document.querySelector('#echoCancellation').checked;
const constraints = {
audio: {
echoCancellation: {exact: hasEchoCancellation}
},
video: {
width: 720, height: 480
}
};
console.log('Using media constraints:', constraints);
await init(constraints);
});
最佳答案
request.setRequestHeader('Content-Type', 'video/webm');
关于javascript - 如何在发送到服务器之前将 mimetype (video/webm) 和编解码器 (vp9) 添加到 blob 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61614640/
以下代码在gcc中没有问题。在 VS 2010 Express 中,它无法给出 ------ Build started: Project: helium, Configuration: Debug
我有一个我不明白的光线生成问题。我的光线方向计算错误。我将这段代码从 DirectX 11 移植到 Vulkan,在那里它运行良好,所以我很惊讶我无法让它运行: vec4 farPos = inver
我需要从依存分析树中提取形式为 NP-VP-NP 的三元组,作为 Stanford Parser 中词汇化分析的输出。 执行此操作的最佳方法是什么。例如如果解析树如下: (ROOT (S
我正在为我正在开发的项目制作序列图。没有什么太复杂,只是一些来回调用的生命线。 问题是,在近距离时,我的消息描述的白色背景框会盖住我的生命线框和虚线之类的东西。您可以在下图中看到问题,尽管我尝试将它们
实际上,我使用 Java 从西类牙语文本中提取三元组。我需要提取 NP-VP-NP 形式的三元组。我也在使用斯坦福解析器 CoreNLP v 3.7.0 和西类牙语模型 v 3.7.0。接下来我的问题
我想根据连词和逗号分割树。例如,当我有 VP 和 VP 或 NP 和 NP 或 VP, VP 或 NP,NP 时,我想分别提取每个 VP 或 NP。我有以下代码: List subtrees = c
#include #include #include int mms; int ps; int rp; struct node{ int *pf; int *vp; } *pt=NULL; vo
我有一个示例,其中斯坦福 NLP 为句子输出了一个奇怪的解析树: Clean my desk (ROOT (NP (NP (JJ Clean)) (NP (PRP$ my) (NN
我的 ERD 是 alt text http://files.getdropbox.com/u/175564/db/db-8.png 我现在使用 integer(2) 来表示数据类型是 boolean
我无法启动android模拟器,它总是退出并出现错误:WHPX: Unexpected VP exit code 5 . 我使用了 Android Studio 3.6.2 和最新的 AVD,并安装了
我想计算文本中 pp/np/vp 的数量,但我不知道如何在 openNLP chunker 中识别 PP-tags/NP-tags/VP-tags?我已经尝试过这段代码,但它不起作用。 Chunker
我需要表示这样的重载方法: +setAttribute(int) +setAttribute(float) +setAttribute(boolean) 在单个 Java 类中。 VP UML 不允许
我正在使用 Stanford CoreNLP,我知道它不支持句子分块。我正在寻找的是,给定一个输入句子,将类似这样的内容作为输出: [NP He ] [VP reckons ] [NP the cu
当我想创建散点图矩阵时,出现错误 Error in grid.Call.graphics(C_downviewport, name$name, strict) : Viewport 'plot_01.
输出中有 Give me 0 0 #include #define fsv(i , n) for(int i = 0 ; i > n ; vector > > vp(n); vector v
我正在使用 vimeo 播放器在我的页面上嵌入视频。 由于某些原因,视频的缩略图在 Safari 中有 vp-preview-invisible 类(这使得缩略图不可见),但在 Chrome 中没有这
我正在使用 vimeo 播放器在我的页面上嵌入视频。 由于某些原因,视频的缩略图在 Safari 中有 vp-preview-invisible 类(这使得缩略图不可见),但在 Chrome 中没有这
我是一名优秀的程序员,十分优秀!