Javascript 从ArrayBuffer系列创建webm视频blob
以下是我捕获视频流并编码到webm的代码(使用): 下面是听众:Javascript 从ArrayBuffer系列创建webm视频blob,javascript,html5-canvas,html5-video,webm,Javascript,Html5 Canvas,Html5 Video,Webm,以下是我捕获视频流并编码到webm的代码(使用): 下面是听众: let queue = []; worker.onmessage = ev => { if (!ev.data) { console.log('End of stream'); } if (ev.data instanceof ArrayBuffer && ev.data.byteLength !== undefined) { const arrayBu
let queue = [];
worker.onmessage = ev => {
if (!ev.data) {
console.log('End of stream');
}
if (ev.data instanceof ArrayBuffer && ev.data.byteLength !== undefined) {
const arrayBuffer = ev.data;
queue.push(arrayBuffer);
}
};
最后制作视频:
setInterval(function () {
let webm = buildWebmVideoFromArrayOfBuffer();
queue = [];
socket.send(webm);
}, 500);
如果不使用
MediaSource
如何从这个缓冲区阵列构建webm视频?我的目标是每500毫秒构建一个webm视频。为什么不直接使用MediaRecorder?另外,您是否正在寻找一系列可独立播放的500毫秒视频?为此,您需要一种方法将GOP长度设置为15,这是非常低且根本没有效率的。我也不认为你可以用MediaRecorder设置GOP的长度。也许你可以用这个WASM模块。。。这就是你使用它的原因吗?我现在正在使用MJPEG/AVI容器进行直播,使用我的自定义编码器/解码器,工作良好、快速和实时,唯一的问题是JPEG的大小随着时间的推移会消耗更多的带宽,所以我想先使用WEBM进行编码,然后再使用相同的方法通过网络传输,要创建500毫秒的区块视频,即每500毫秒15帧,这对于30 FPS来说是很好的。听起来你不需要单独播放区块。您可以单独存储初始化段。为什么不使用MediaRecorder?。。。特别是当你关心表现的时候。而且,如果你真的需要一个GOP大小为15(我假设,等待时间)为什么不考虑整个WebRTC栈,并获得所有这些优化是免费的?是的,我已经考虑WEBRTC,但在这个阶段,我必须先做这种方法。当你说使用MediaRecorder
时,你是说MediaRecorder
可以录制500毫秒的Webm视频,并且可以单独播放?我试过了,但输出与webm wasm相同,它是数组缓冲区。您没有澄清为什么希望单独播放它们。。。这就是你的要求,我不明白。你为什么不直接用MediaRecorder呢?另外,您是否正在寻找一系列可独立播放的500毫秒视频?为此,您需要一种方法将GOP长度设置为15,这是非常低且根本没有效率的。我也不认为你可以用MediaRecorder设置GOP的长度。也许你可以用这个WASM模块。。。这就是你使用它的原因吗?我现在正在使用MJPEG/AVI容器进行直播,使用我的自定义编码器/解码器,工作良好、快速和实时,唯一的问题是JPEG的大小随着时间的推移会消耗更多的带宽,所以我想先使用WEBM进行编码,然后再使用相同的方法通过网络传输,要创建500毫秒的区块视频,即每500毫秒15帧,这对于30 FPS来说是很好的。听起来你不需要单独播放区块。您可以单独存储初始化段。为什么不使用MediaRecorder?。。。特别是当你关心表现的时候。而且,如果你真的需要一个GOP大小为15(我假设,等待时间)为什么不考虑整个WebRTC栈,并获得所有这些优化是免费的?是的,我已经考虑WEBRTC,但在这个阶段,我必须先做这种方法。当你说使用MediaRecorder
时,你是说MediaRecorder
可以录制500毫秒的Webm视频,并且可以单独播放?我试过了,但输出与webm wasm相同,它是数组缓冲区。您没有澄清为什么希望单独播放它们。。。这是你的要求,我不明白。
setInterval(function () {
let webm = buildWebmVideoFromArrayOfBuffer();
queue = [];
socket.send(webm);
}, 500);