electron + fluent-ffmpeg推送桌面、音视频、窗口

1、桌面

ffmpeg()
.input('desktop') // 推送桌面配置
.inputFormat('gdigrab')
.inputOptions('-offset_x 0')
.inputOptions('-offset_y 0')
.inputOptions('-video_size 640x480')

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')

3、窗口

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

4、获取设备名称

// 先获取授权 否则获取的devices名称都是空的
navigator.mediaDevices.getUserMedia({audio: true,video:true});
navigator.mediaDevices.enumerateDevices().then((devices)=> {
});
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;
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值