检索当前系统所有可用设备
export function GetSystemEnumerateDevices() {
return navigator.mediaDevices.enumerateDevices().then(function(devices) {
const audioInputOptions = [];
const videoInputOptions = [];
const audiooutputOptions = [];
let isAudioInput = false;
let isVideoInput = false;
let isAudioOutput = false;
const audioDeviceIds = [];
const videoDeviceIds = [];
let tmp = devices.filter(function(device) {
if (device.kind === 'videoinput') {
if (!isVideoInput) {
isVideoInput = true;
}
if (device.label === 'screen-capture-recorder') {
videoDeviceIds.push(device.deviceId);
videoInputOptions.push({ value: device.deviceId, label: device.label });
} else {
videoDeviceIds.unshift(device.deviceId);
videoInputOptions.unshift({ value: device.deviceId, label: device.label });
}
};
if (device.kind === 'audioinput') {
if (!isAudioInput) {
isAudioInput = true;
}
audioInputOptions.push({ value: device.deviceId, label: device.label });
audioDeviceIds.push(device.deviceId);
};
if (device.kind === 'audiooutput') {
if (!isAudioOutput) { isAudioOutput = true };
audiooutputOptions.push({ value: device.deviceId, label: device.label });
};
return false;
});
tmp = null;
return {audioInputOptions, videoInputOptions, audiooutputOptions, isAudioInput, isVideoInput, isAudioOutput, audioDeviceIds, videoDeviceIds}
});
}
设备id获取MediaStream
export function DeviceidToMediaStream(devId: string) {
return new Promise((resolve, reject) => {
if (typeof devId != 'string') {
return reject({code: 0, message: '设备id必须是字符串'});
}
GetSystemEnumerateDevices().then((devInfo) => {
const {audioDeviceIds, videoDeviceIds} = devInfo;
const constraints = {
audio: false,
video: false,
}
let mediaType = 1;
if (audioDeviceIds.includes(devId)) {
constraints.audio = true;
delete constraints.video;
}
if (videoDeviceIds.includes(devInfo)) {
mediaType = 2;
constraints.video = true;
delete constraints.audio;
}
let isHas = Object.values(constraints).filter((item) => {
return item;
})
if (isHas.length === 0) {
return reject({code: 0, message: '没有找到采集设备'});
}
navigator.mediaDevices.getUserMedia(constraints).then((locStream) => {
return resolve(locStream);
}).catch((error) => {
const cause = error.message;
let message = mediaType === 1 ? '麦克风启动失败' : '摄像头启动失败';
if (cause === 'Permission denied') {
message = '媒体采集权限被拒绝';
} else if (cause === 'Requested device not found') {
message = mediaType === 1 ? '未检测到麦克风' : '未检测到采集设备';
} else if (cause === 'Could not start video source') {
message = '摄像头启动失败,可能被其它应用占用或被拔出';
} else if (cause === 'Device in use') {
message = '设备被另一个应用或进程占用'
} else if (cause === 'Starting videoinput failed') {
message = '设备启动失败,可能被被另一个应用或进程占用'
};
return reject({code: 0, message});
})
})
})
}
MediaStream获取视频的宽度和高度
export function GetMediaStreamVideoWidthHeight(streams: MediaStream) {
return new Promise((resolve, reject) => {
const videoTrackArr = streams.getVideoTracks();
if (videoTrackArr.length === 0) {
reject({code:0, message:'没有视频轨道'});
return;
}
const tmp = document.createElement('video');
tmp.srcObject = streams;
tmp.onloadedmetadata = function() {
resolve({width: tmp.videoWidth, height: tmp.videoHeight});
tmp.srcObject = null;
tmp.remove();
};
tmp.onerror = function() {
reject({ code: 1, message: '视频加载失败' });
tmp.srcObject = null;
tmp.remove();
};
})
}
判断音频录入设备是否存在
export function JudgeAudioInputDevIdIsExist(devId: string) {
return new Promise((resolve, reject) => {
if (typeof devId != 'string') {
return reject({code: 0, message: '设备id必须是字符串'});
};
GetSystemEnumerateDevices().then((devInfo) => {
const {audioDeviceIds} = devInfo;
if (!audioDeviceIds.includes(devId)) {
return reject({code: 0, message: '设备id不存在'});
};
resolve({code: 1, message: devId});
});
})
}
判断视频录入设备是否存在
export function JudgeVideoInputDevIdIsExist(devId: string) {
return new Promise((resolve, reject) => {
if (typeof devId != 'string') {
return reject({code: 0, message: '设备id必须是字符串'});
};
GetSystemEnumerateDevices().then((devInfo) => {
const {videoDeviceIds} = devInfo;
if (!videoDeviceIds.includes(devId)) {
return reject({code: 0, message: '设备id不存在'});
}
resolve({code: 1, message: devId});
});
})
}
拦截音视频权限可能会报错的问题
export function BackGetUserMediaError(cause: string, mediaType: number) {
let message = '';
let mediaName= mediaType === 1 ? '麦克风' : '摄像头'
if (cause === 'Permission denied') {
message = `${mediaName}获取权限被拒绝,请检查浏览器是否开启使用权限`;
} else if (cause === 'Requested device not found') {
message = `未检测到${mediaName}设备`;
} else if (cause === 'Could not start video source') {
message = '摄像头启动失败,可能被其它应用占用或被拔出或系统关闭了摄像头调用权限';
} else if (cause === 'Device in use') {
message = `${mediaName}设备被另一个应用或进程占用`;
} else if (cause === 'Starting videoinput failed') {
message = '摄像头启动失败,可能被被另一个应用或进程占用';
} else if (cause === 'Failed to allocate videosource') {
message = '摄像头启动失败,可能系统关闭了摄像头使用权限';
} else if (cause === 'Permission denied by system') {
message = `${mediaName}启动失败,可能系统关闭了设备使用权限`;
} else {
message = `${mediaName}启动失败`
};
return {code: 0, cause, message};
}