electron录制屏幕+声音并保存在本地

const electron = require('electron');
const {
	desktopCapturer
} = require('electron');
const fs=require("fs");
let source;
/*获取当前屏幕和应用窗口源信息*/
desktopCapturer.getSources({
	types: ['window', 'screen']
}, (error, sources) => {
	if(error) throw error;
	console.log(sources); // sources 当前屏幕和应用窗口的数组
	source = sources[0];
	
	/*首先根据选择的录制源是窗口还是摄像头以不同的方式获取视频流;*/
	let sourceId = source.id; // 所选择的屏幕或窗口 sourceId
	console.log(sourceId);
	let stream = navigator.mediaDevices.getUserMedia({
		audio: false,
		 video: {
		    mandatory: {
		      chromeMediaSource: 'desktop',
		      chromeMediaSourceId: sourceId,
		      maxWidth: window.screen.width,
		      maxHeight: window.screen.height,
		    }
		  }
	});

	/*因为无法通过直接设置 audio: true 来获取音频,所以需要另外加入麦克风的音轨。*/

	stream
		.then(Mediastream => {
			let audioTracks = navigator.mediaDevices
				.getUserMedia({
					audio: true,
					video: false
				})
				.then(mediaStream =>{
					//mediaStream.getAudioTracks()[0];
					Mediastream.addTrack(mediaStream.getAudioTracks()[0]);
					createRecorder(Mediastream); // createRecorder() 函数实现见下文
				});
		})
		.catch(err => console.error('startRecord error', err));
});

/*createRecorder() 函数初始化录制;*/

let recorder = null;
let i=0;
function createRecorder(stream) {
  recorder = new MediaRecorder(stream);
  recorder.start(10000);
  // 如果 start 没设置 timeslice,ondataavailable 在 stop 时会触发
  recorder.ondataavailable = event => { 
  console.log(event);
    let blob = new Blob([event.data], {
      type: 'video/mp4',
    });
    saveMedia(blob);
  };
  recorder.onerror = err => {
    console.error(err);
  };
};
/*stopRecorder() 函数结束录制并保存至本地 mp4 文件;*/
function stopRecord() {
  recorder.stop();
}

function saveMedia(blob) {
  let reader = new FileReader();
  reader.onload = () => {
    let buffer = new Buffer(reader.result);
    fs.writeFile('test'+i+'.mp4', buffer, {}, (err, res) => {
      if (err) return console.error(err);
    });
    i++;
  };
  reader.onerror = err => console.error(err);
  reader.readAsArrayBuffer(blob);
}


$("#stop").click(function(){
	stopRecord();
});

可以录制成10s一段的小段视频并保存在项目目录,有个问题是只有第一个视频可以正常播放,后面录制的无法打开,目前没有找到原因,知道原因的大神说下~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值