WebRTC


WebRTC

这篇总结主要介绍一下WebRTC

WebRTC是基于navigator.mediaDevices中的getUserMedia()方法实现的

直播RTMP 单项传播
视频/语音WebRTC 双向传播

WebRTC配合websocket

是一个互联网浏览器间的实时通信平台

WebRTC虽然冠以’web’之名,但不仅仅受限于传统互联网应用或浏览器的终端运行环境,
实际上无论终端环境是浏览器,桌面应用,移动设备,
只要ip连接可到达且符合WebRTC规范就可以互通

前端获取摄像头流程

1.初始化button,video控件
2.绑定打开摄像头响应事件onOpenCamera
3.如果要打开摄像头则点击”打开摄像头按钮”,触发onOpenCamera事件的调用
4.当触发onOpenCamera调用时:
a.设置约束条件,即getUserMedia函数的入参
b.getUserMedia有两种情况,一是正常打开摄像头,使用handleSuccess处理:
一种是打开摄像头失败,使用handleError处理
c.当正常打开摄像头时,则将getUserMedia返回的stream对象赋值给video控件的srcObject,
即可将视频显示出来

html文件

<video id="vid" autoplay playsinline></video>
<button id="btn">打开摄像头<button>

js文件

const constrains = {
    audio:true,
    video:{width:1200,height:720}
    }
//获取成功的结果
function handleSuccess(stream) {
    const video = document.querySelector('#vid')
    video.srcObject = stream
}
//失败的结果
function handleError(error) {
    console.log(error)
}
/*他这个就是利用navigator.mediaDevices.getUserMedia(constrains)
的成功拿到它成功的结果,而constrains配置项则是指定了请求的媒体类型和相对应的参数,
例如是音频还是视频?
分辨率是多少?分辨率的最大值是多少,最小值是多少?同时能设置你所理想的值通过ideal*/
function onOpenCamera(){
    navigator.mediaDevices.getUserMedia(constrains)
        .then(handleSuccess)
        .catch(handleError)
}
document.querySelector('#btn').addEventListener('click',onOpenCamera)

前端获取音频流程

// html文件
<radio id="rad" autoplay controls></radio>
<button id="btn">播放录音<button>

// js文件
const constrains = {
    audio:true,
    video:{width:1200,height:720}
    }
//获取成功的结果
function handleSuccess(stream) {
    const video = document.querySelector('#rad')
    audio.srcObject = stream
}
//失败的结果
function handleError(error) {
    console.log(error)
}
/*他这个就是利用navigator.mediaDevices.getUserMedia(constrains)的成功拿到它成功的结果,
而constrains配置项则是指定了请求的媒体类型和相对应的参数,例如是音频还是视频?分辨率是多少?
分辨率的最大值是多少,最小值是多少?同时能设置你所理想的值通过ideal*/
function onOpenCamera(){
    navigator.mediaDevices.getUserMedia(constrains)
        .then(handleSuccess)
        .catch(handleError)
}
document.querySelector('#btn').addEventListener('click',onOpenCamera)

用于获取媒体流,用于音视频采集和播放。

navigator.mediaDevices.getUserMedia(constraints)返回的是一个promise对象,
使用then可以拿到他成功的结果,而他的成功的结果即视频的实时流

constraints这个形参是一个对象
1.可以配置是否显示音频/视频

{ audio: true, video: true }

2.同样可以配置屏幕的分辨率,浏览器会尝试满足

{audio: true,video: { width: 1280, height: 720 }}

3.同样可以强制要求配置你的分辨率的最大值/最小值,浏览器会强制满足

以下参数表示要求获取最低为 1280x720 的分辨率
{audio: true,
  video: {width: { min: 1280 },height: { min: 720 }
}}

4.在第三点的强制下,可能会满足不了,因此promise会返回失败的结果,
因此我们可以给他设置一个理想值

{audio: true,
  video: {
    width: { min: 1024, ideal: 1280, max: 1920 },
    height: { min: 776, ideal: 720, max: 1080 }
  }
}

5.开启前置摄像头

{ audio: true, video: { facingMode: "user" } }

6.开启后置摄像头

{ audio: true, video: { facingMode: { exact: "environment" } } }

视频完整代码:

//html   
//playsinline该属性标识内联播放,如果不设置,那么它将会全屏播放
<video id="vid" autoplay playsinline></video>
<button id="btn">打开摄像头<button>
//js
document.querySelector('#btn').addEventListener('click',()=>{
    navigator.mediaDevices.getUserMedia(a).then(res=>{
    //res则是成功的一个媒体内容的流.
    //因此你此时只需要把这个媒体内容的流.赋值给video的实时流即可
          document.querySelector('#vid').srcObject = res
        })
        .catch(null)
})

音频完整代码与视频一致,只需要将video改为audio即可

<audio id="rad" autoplay controls></audio>
<button id="btn">播放录音<button>
  <script>
    navigator.mediaDevices.getUserMedia({audio:true})
    .then(res=>{
        document.querySelector('#btn').addEventListener('click',()=>{
          document.querySelector('#rad').srcObject = res
        })
      }
    )
  </script>

前端同时打开摄像头与麦克风

直接把constraints这个形参中的audio与video都为true即可


文章作者: 冷杨威
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 冷杨威 !
  目录
-->