...//判断浏览器是否支持这些 API
if(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices){console.log("enumerateDevices() not supported.");return;}// 枚举 cameras and microphones.
navigator.mediaDevices.enumerateDevices().then(function(deviceInfos){//打印出每一个设备的信息
deviceInfos.forEach(function(deviceInfo){console.log(deviceInfo);console.log(deviceInfo.kind+": "+deviceInfo.label+" id = "+deviceInfo.deviceId);});}).catch(function(err){console.log(err.name+": "+err.message);});
2.摄像头
2.1 非编码帧 与 编码帧
名字
定义
非编码帧
采集的原始视频数据叫做非编码帧,属于YUV格式或者RGB格式
编码帧
通过编码器(如 H264/H265、VP8/VP9)压缩后的帧称为编码帧
以 H264 为例,经过 H264 编码的帧包括以下三种类型
名字
定义
I帧
关键帧。压缩率低,可以单独解码成一幅完整的图像。
P帧
参考帧。压缩率较高,解码时依赖于前面已解码的数据。
B帧
前后参考帧。压缩率最高,解码时不光依赖前面已经解码的帧,而且还依赖它后面的 P 帧。换句话说就是,B 帧后面的 P 帧要优先于它进行解码,然后才能将 B 帧解码。
functionhandleDataAvailable(e){if(e&&e.data&&e.data.size>0){buffer.push(e.data);}}.........buffer=[];varoptions={mimeType:'video/webm;codecs=vp8'}if(!MediaRecorder.isTypeSupported(options.mimeType)){console.error(`${options.mimeType} is not supported!`);return;}try{mediaRecorder=newMediaRecorder(window.stream,options);}catch(e){console.error('Failed to create MediaRecorder:',e);return;}mediaRecorder.ondataavailable=handleDataAvailable;mediaRecorder.start(10);
functiongotMediaStream(stream){window.stream=stream;videoplay.srcObject=stream;}......if(!navigator.mediaDevices||!navigator.mediaDevices.getDisplayMedia){console.log('getDisplayMedia is not supported!');return;}else{varconstraints={video:{width:640,height:480,frameRate:15},audio:false}navigator.mediaDevices.getDisplayMedia(constraints).then(gotMediaStream).catch(handleError);}
functionhandleDataAvailable(e){if(e&&e.data&&e.data.size>0){buffer.push(e.data);}}functionstartRecord(){buffer=[];varoptions={mimeType:'video/webm;codecs=vp8'}if(!MediaRecorder.isTypeSupported(options.mimeType)){console.error(`${options.mimeType} is not supported!`);return;}try{mediaRecorder=newMediaRecorder(window.stream,options);}catch(e){console.error('Failed to create MediaRecorder:',e);return;}mediaRecorder.ondataavailable=handleDataAvailable;mediaRecorder.start(10);}