使用 MediaRecorder API 在录制的视频中搜索不起作用

Aks*_*ore 7 javascript screen-recording web-mediarecorder mediarecorder-api

我正在尝试使用 MediaRecorder API 构建屏幕录制。

作为暗示性媒体记录方法

var chunks = [];
var recorder = new MediaRecorder(stream);

recorder.streams = [stream];

recorder.ondataavailable = function(e) {
    chunks.push(e.data);
};

recorder.onstop = function(){
      var blob = new Blob(chunks, {type: "video/webm"});
      chunks = [];

      var mimeType = 'video/webm';
      var fileExtension = 'webm';

      var file = new File([blob ? blob : ''], getFileName(fileExtension), {
          type: mimeType
      });
};
Run Code Online (Sandbox Code Playgroud)

使用这种方法录制工作正常,但录制的视频搜索不起作用。

我在网上搜索了一些关于这个问题的信息,我发现视频标题不包含持续时间。

file控制台上打印对象时,它包含以下属性,

lastModified : 1527592713006
lastModifiedDate : Tue May 29 2018 16:48:33 GMT+0530 (India Standard Time) 
name : "Recording-May,29 2018 4:48:33 PM.webm"
size : 1971220
type : "video/webm"
webkitRelativePath : ""
Run Code Online (Sandbox Code Playgroud)

可以看到文件对象不包含持续时间属性。

任何人都可以建议任何可用的javascript库,它只能在准备视频文件时修复客户端的视频标题吗?

Bas*_*imo 8

查看 getSeekableBlob,网址为https://recordrtc.org/

这是代码:

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://cdn.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);
}
Run Code Online (Sandbox Code Playgroud)


ACB*_*CBM 5

这是Chrome 中的一个众所周知的错误。基本上,录制媒体的持续时间不会添加到最终文件的标题中。

可悲的是,这个错误目前WontFix被 Chromium 团队标记为。但是,有几种解决方法:

  • 在后端,使用 ffmpeg 修复标头: ffmpeg -i old.webm output.webm

  • 在前端,解决此答案或使用包ts-ebml