首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从电子应用程序将desktopCapturer保存到视频文件

从电子应用程序将desktopCapturer保存到视频文件
EN

Stack Overflow用户
提问于 2018-03-10 11:06:23
回答 1查看 1.4K关注 0票数 1

基于电子api这个问题,我试图将录制的用户屏幕保存到根应用程序文件夹中的视频文件夹中的.webm文件中。

实际上,它几乎可以工作,因为它保存了.webm文件,但是保存的文件是空的,它的重量是0B。我不知道我在这里错过了什么。

所以看起来好像是因为文件是空的,所以记录不正确。

编辑时,我发现记录可能工作正常,因为我控制台日志中的blob在内部有值,在toArrayBuffer之后,blob就不再有价值了。

守则是:

代码语言:javascript
复制
(function () {
    'use strict';

    var fs = require('fs');
    var { desktopCapturer } = require('electron');
    var recorder, blobs = [];

    angular
        .module('app')
        .controller('loggedScreen', Controller);

    Controller.$inject = ['$scope'];

    function Controller($scope) {

        var startRecord = function () {
            console.log('started');
            desktopCapturer.getSources({types: ['window', 'screen']}, function(error) {
                if (error) throw error;
                navigator.webkitGetUserMedia({
                    audio: false,
                    video: {
                        mandatory: {
                            chromeMediaSource: 'desktop',
                            minWidth: 1280,
                            maxWidth: 1280,
                            minHeight: 720,
                            maxHeight: 720
                        }
                    }
                }, handleStream, handleError);
                return;
            });
        };

        function handleError(err) {
            console.log('something went wrong but it shouldnt');
        }

        function handleStream(stream) {
            recorder = new MediaRecorder(stream);
            blobs = [];
            recorder.ondataavailable = function (event) {
                blobs.push(event.data);
            };
            recorder.start();
        }

        function toArrayBuffer(blob, cb) {
            var fileReader = new FileReader();
            fileReader.onload = function() {
                var arrayBuffer = this.result;
                cb(arrayBuffer);
            };
            fileReader.readAsArrayBuffer(blob);
        }

        function toBuffer(ab) {
            var buffer = new Buffer(ab.byteLength);
            var arr = new Uint8Array(ab);
            for (var i = 0; i < arr.byteLength; i++) {
                buffer[i] = arr[i];
            }
            return buffer;
        }

        function stopRecording() {
            recorder.stop();
            console.log(blobs); // 300k bytes
            toArrayBuffer(new Blob(blobs, {type: 'video/webm'}), function(ab) {
                console.log(ab); // 0 bytes
                var buffer = toBuffer(ab);
                var file = `./videos/example.webm`;
                fs.writeFile(file, buffer, function(err) {
                    if (err) {
                        console.error('Failed to save video ' + err);
                    } else {
                        console.log('Saved video: ' + file);
                    }
                });
            });
        }

        startRecord();
        setTimeout(function() {
            // stop recording after 7sec
            stopRecording();
        }, 7000);
    }
})();

startRecord()函数将立即执行,它还将按预期的方式在此控制器上启动console.log

stopRecording()函数在7秒后正确执行,console.log('Saved video: ' + file);很好。

然后我转到我刚创建的视频文件夹,打开保存的example.webm文件,它是空的。

它不会在控制台中打印任何错误。

  • consoled.log(blobs)stopRecording()函数中停止录音机,看看它是否真的是Blob。
  • 我在console.log(ab)内部toArrayBuffer(new Blob(blobs, {type: 'video/webm'}), function(ab) {})回调。

我有行为,因为blobs包含值,而ab不包含值。

我自己真的解决不了这个问题,为了寻找答案,我用最少的复制例子创建了演示储存库 --只需克隆它,就可以看到您自己的行为

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-03 14:17:51

您的recorder.stop()将按以下方式运行:(来自MediaRecorder文档)

当调用stop()方法时,UA对运行以下步骤的任务进行排队:

  1. 如果MediaRecorder.state是“非活动的”,则引发DOM InvalidState错误并终止这些步骤。如果MediaRecorder.state不是“非活动”,则继续下一步。
  2. MediaRecorder.state设置为“非活动”并停止捕获媒体。
  3. 引发包含收集到的数据块的dataavailable事件。
  4. 引发stop事件。

在您的示例中,您不需要等待stop事件,因此只有在启动文件保存方法之后,dataavailable才会填充blobs

您必须重组stopRecording以确保记录的数据是可用的。例如:

代码语言:javascript
复制
function stopRecording () {
  const save = () => {
    ...
  }
  recorder.onstop = save
  recorder.stop()
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49208343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档