当前位置:   article > 正文

electron + fluent-ffmpeg推送桌面、音视频、窗口_windows下electron使用fluent-ffmpeg

windows下electron使用fluent-ffmpeg

1、桌面

ffmpeg()
.input('desktop') // 推送桌面配置
.inputFormat('gdigrab')
.inputOptions('-offset_x 0')
.inputOptions('-offset_y 0')
.inputOptions('-video_size 640x480')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、音视频

// video和audio是摄像头和麦克风名称,
// 可通过navigator.mediaDevices.enumerateDevices
// 或者ffmpeg命令获取
.input(`video=${video[0]}`) // 推送摄像头
.inputFormat('dshow')
.inputOptions('-s 320*180')
.complexFilter([{
	filter: 'overlay',
	options: {
		x: 'main_w-overlay_w',
		y: 'main_h-overlay_h'
	},
	inputs: ['[0:v]', '[1:v]']
}])
.input(`audio=${audio[0]}`) // 推送音频
.inputFormat('dshow')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

3、窗口

// title是窗口的名称
// desktopCapturer.getSources({types: ['window', 'screen']})获取
.input(`title=${title}`) // 推送桌面配置
.inputFormat('gdigrab')
.inputOptions('-offset_x 0')
.inputOptions('-offset_y 0')
.inputOptions('-video_size 640x480')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4、获取设备名称

// 先获取授权 否则获取的devices名称都是空的
navigator.mediaDevices.getUserMedia({audio: true,video:true});
navigator.mediaDevices.enumerateDevices().then((devices)=> {
});
  • 1
  • 2
  • 3
  • 4
import ffmpegPath from '@ffmpeg-installer/ffmpeg';
import cp from "child_process";

/**
 * 获取设备列表
 * @returns {Promise<any>}
 */
const devices = () => {
	return new Promise((resolve, reject) => {
		// 视频设备
		const videoList = [];
		// 音频设备
		const audioList = [];
		// 视频设备标记
		let videoFlag = false;
		// 音频设备标记
		let audioFlag = false;
		const devicesCmd = cp.spawn(ffmpegPath.path, ["-f", "dshow", "-list_devices", "true", "-i", "dummy"]);
		let devices = '';
		devicesCmd.stderr.on("data", data => {
			devices += data.toString();
		});
		devicesCmd.on("close", code => {
			// 换行符
			const splitFlag = (process.platform === 'win32' ? '\r\n' : '\n')
			const lines = devices.split(splitFlag);
			for (let i = 0; i < lines.length; i++) {
				const device = lines[i]
				if (device.indexOf('[dshow') > -1) {
					if (device.indexOf('DirectShow video devices') > -1) {
						videoFlag = true;
						audioFlag = false;
					} else if (device.indexOf('DirectShow audio devices') > -1) {
						videoFlag = false;
						audioFlag = true;
					} else if (video_device_name_flag && device.indexOf('Alternative name') == -1) {
						if (device.match(/\"(.*)\"/)) {
							const videoName = device.match(/\"(.*)\"/)[1]
							videoList.push(videoName);
						}
					} else if (audioFlag && device.indexOf('Alternative name') == -1) {
						if (device.match(/\"(.*)\"/)) {
							let audioNname = device.match(/\"(.*)\"/)[1];
							audioList.push(audioNname);
						}
					}
				}
			}
			resolve({
				audio: audioList,
				video: videoList
			})
		});
	})
};

export default devices;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/999077
推荐阅读
相关标签
  

闽ICP备14008679号