gpt4 book ai didi

javascript - 无法使用 EBML.js - MediaRecorder API - Chrome 从 mediarecorder 创建可查找的视频 blob

转载 作者:行者123 更新时间:2023-12-03 20:43:07 31 4
gpt4 key购买 nike

使用媒体记录器,我可以在 azure 上上传和附加视频 blob。但是无法使用以下代码在下载时查找组合视频 -

var chunks =[];
var mediaRecorder = new MediaRecorder(stream, 'video/x-matroska;codecs=vp8,opus');
mediaRecorder.ondataavailable = function(event) {
if(event.data && event.data.size > 0) {
chunks.push(event.data);
appendBlockToAzure(chunks);
}
};
mediaRecorder.start(10000);
我尝试使用 EBML.js,如果我使用以下代码,则会得到可搜索的视频文件。这种方法需要最后处理文件。因此,最终文件的大小可能为 1GB,上传需要很长时间。
var chunks =[];
var mediaRecorder = new MediaRecorder(stream, 'video/x-matroska;codecs=vp8,opus');
mediaRecorder.ondataavailable = function(event) {
if(event.data && event.data.size > 0) {
chunks.push(event.data);
if(mediaRecorder.state == "inactive") { //if media recorder is stopped
var combined = new Blob(chunks, { type: event.data.type });
getSeekableBlob(combined, function (seekableBlob) {
saveCombinedVideoToAzure(seekableBlob);
});
}
}
};
mediaRecorder.start(10000);
这就是我想同时上传到 azure 的原因。如果我使用以下代码,则会记录未知标签警告,然后记录长度错误。此外,视频文件不可播放。
var seekablechunks =[];
var mediaRecorder = new MediaRecorder(stream, 'video/x-matroska;codecs=vp8,opus');
mediaRecorder.ondataavailable = function(event) {
if(event.data && event.data.size > 0) {
getSeekableBlob(event.data, function (seekableBlob) {
seekablechunks.push(seekableBlob);
saveCombinedVideoToAzure(seekablechunks);
});
}
};
mediaRecorder.start(10000);
函数“getSeekableBlob”:
function getSeekableBlob(inputBlob, callback) {
// EBML.js copyrights goes to: https://github.com/legokichi/ts-ebml
if(typeof EBML === 'undefined') {
throw new Error('Please link: https://www.webrtc- experiment.com/EBML.js');
}

var reader = new EBML.Reader();
var decoder = new EBML.Decoder();
var tools = EBML.tools;

var fileReader = new FileReader();
fileReader.onload = function (e) {
var ebmlElms = decoder.decode(this.result);
ebmlElms.forEach(function (element) {
reader.read(element);
});
reader.stop();
var refinedMetadataBuf = tools.makeMetadataSeekable(reader.metadatas, reader.duration, reader.cues);
var body = this.result.slice(reader.metadataSize);

var newBlob = new Blob([refinedMetadataBuf, body], {
type: 'video/webm'
});

callback(newBlob);
};
fileReader.readAsArrayBuffer(inputBlob);
}
有没有办法获得可搜索的 blob 并将它们上传到 azure?

最佳答案

对于媒体的开放式流媒体源(例如 MediaRecorder)来说,使用 SeekHead elements 创建文件是一个挑战。在里面。 SeekHead 元素中的 Seek 元素包含文件中元素的字节偏移量。
MediaRecorder 不会像您发现的那样创建段或 SeekHead 元素。为此,它需要能够看到 future ,以了解 future 压缩的视频和音频元素在文件中的大小。
处理此问题的一个好方法可能是在服务器上对上传的文件进行后处理。您可以使用 ts-ebml当文件完全上传时,以流方式在服务器上执行此操作。
我想,有可能在您的浏览器中创建 Javascript 软件,该软件可以转换 MediaRecorder 发出的数据流,以便即时查找。为了使您的流可搜索,您需要经常插入 SeekHead 元素。您将缓冲多秒的流,然后在每个缓冲区中定位 Cluster 元素,然后写入一个 SeekHead 元素指向其中的一些元素。 (Chrome 的 MediaRecorder 输出以视频关键帧开头的集群。)如果您成功地做到了这一点,您就会对 Matroska/webm 了解很多。

关于javascript - 无法使用 EBML.js - MediaRecorder API - Chrome 从 mediarecorder 创建可查找的视频 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66480784/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com