WebRTC简介及使用

须尽欢~~ 2024-07-07 16:03:06 阅读 63

文章目录

前言一、WebRTC 简介1、webrtc 是什么2、webrtc 可以做什么3、数据传输需要些什么4、SDP 协议5、STUN6、TURN7、ICE

二、WebRTC 整体框架三、WebRTC 功能模块1、视频相关①、视频采集---video_capture②、视频编解码---video_coding③、视频加密---video_engine_encryption④、视频媒体文件---media_file⑤、视频图像处理---video_processing⑥、视频显示---video_render⑦、网络传输与流控

2、音频相关①、音频设备---audio_device②、音频编解码---audio_coding③、声音加密---voice_engine_encryption④、声音文件⑤、声音处理---audio_processing⑥、网络传输与流控

四、WEBRTC 调用本地摄像头1、确认本地设备2、WebRTC 所用 API①、getUserMedia②、展示摄像头图像

3、Html 与 js 代码4、WEBRTC 调用本地摄像头


前言

WebRTC 只是一个媒体引擎,上面有一个 JavaScript API,所以每个人都知道如何使用它(尽管浏览器实现仍然各不相同),本文对 WebRTC(网页实时通信)的相关内容进行简要介绍。


一、WebRTC 简介

WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音通话或视频聊天的技术,是谷歌 2010 年以 6820 万美元收购 Global IP Solutions 公司而获得的一项技术。

WebRTC 提供了实时音视频的核心技术,包括音视频的采集、编解码、网络传输、显示等功能,并且还支持跨平台:windows,linux,mac,android。

虽然 WebRTC 的目标是实现跨平台的 Web 端实时音视频通讯,但因为核心层代码的 Native、高品质和内聚性,开发者很容易进行除 Web 平台外的移殖和应用。很长一段时间内 WebRTC 是业界能免费得到的唯一高品质实时音视频通讯技术。

1、webrtc 是什么

浏览器为音视频获取传输提供的接口

2、webrtc 可以做什么

浏览器端到端的进行音视频聊天、直播、内容传输

3、数据传输需要些什么

IP、端口、协议客户端、 服务端

4、SDP 协议

有关 SDP 相关的内容可以参考我之前的博文:RTSP协议抓包及讲解

在这里插入图片描述

sdp 协议:SDP 信息相当于 PC 的名片,主要是协商两个端点在传输数据的时候一些配置

数据格式:key=value

SDP 协商利用的是请求和响应这两个模型(offer、answer),Offerer 发给 Answerer 的请求消息称为请求 offer, 内容包括媒体流类型、各个媒体流使用的编码集,以及将要用于接收媒体流的 IP 和端口。Answerer 收到 offer 之后,回复给 Offerer 的消息称为响应,内容包括要使用的媒体编码,是否接收该媒体流以及告诉 Offerer 其用于接收媒体流的 IP 和端口。

在 WebRTC 连接流程中,在创建 PeerConnectionA 后,就会去创建一个 offerSDP,并设置为 localSDP。通过 signaling 发送 PeerB。peerB 收到 peerA 的 SDP 后,把收到的 SDP 设置为 RemoteSDP。在设置完成后,PeerB 再生成 AnswerSDP,设置为 localSDP,通过 signaling 通道发送给 PeerA,PeerA 收到后 AnswerSDP 后,设置为 RemoteSDP,以上流程完成了 SDP 的交换。

5、STUN

允许应用程序发现自己和公网之间的中间件类型,同时也能允许应用程序发现自己被 NAT 分配的公网 IP,从而替代位于应用层中的私网地址,达到 <code>NAT 穿透的目的

6、TURN

通过修改应用层中的私网地址达到 NAT 穿透

也是解决内网穿透的,这里是 stun 不能工作的时候采取的办法

相当于一个中转器即 peerA->TURN-PeerB

7、ICE

交互式连接的建立

把 STUN 和 TURN 结合在一起的一个标准叫 ICE(不是协议, 是整合了 STUN,TURN 的框架)。利用 STUN 和 TURN 为连接提供正确的路由,然后寻找一系列双方可用地址按顺序测试地址,直到找到双方都可用的组合。

二、WebRTC 整体框架

在这里插入图片描述

绿色部分是 WebRTC 核心部分(核心库)

<code>核心层,第一层 C++ API:提供给外面的接口,最主要的是(PeerConnedtion 对等连接)核心层,第二层 Session:上下文管理层(音视频)核心层,第三层【最重要的部分】

音视频引擎 :编解码;音频缓冲 BUFFER 防止音频网络抖动 NetEQ;回音消除;降噪;静音检测;视频引擎 :编解码;jitter buffer 防止视频网络抖动;图像处理增强;传输:SRTP 加密后的 RTP;多路复用;P2P(STUN+TURN+ICE) 核心层,第四层,硬件相关层:音视频采集;网络 IO 紫色部分是 JS 提供的 API(应用层)

整体是应用层调用核心层

三、WebRTC 功能模块

WebRTC 实现了基于网页的视频会议,标准是 WHATWG 协议,目的是通过浏览器提供简单的 javascript 就可以达到实时通讯(Real-Time Communications (RTC))能力。

1、视频相关

①、视频采集—video_capture

源代码在 webrtc\modules\video_capture\main 目录下, 包含接口和各个平台的源代码。

在 windows 平台上,WebRTC 采用的是 dshow 技术,来实现枚举视频的设备信息和视频数据的采集,这意味着可以支持大多数的视频采集设备;对那些需要单独驱动程序的视频采集卡(比如海康高清卡)就无能为力了。

视频采集支持多种媒体类型,比如 I420、YUY2、RGB、UYUY 等,并可以进行帧大小和帧率控制。

②、视频编解码—video_coding

源代码在 webrtc\modules\video_coding 目录下。

WebRTC 采用 I420/VP8 编解码技术。VP8 是 google 收购 ON2 后的开源实现,并且也用在 WebM 项目中。VP8 能以更少的数据提供更高质量的视频,特别适合视频会议这样的需求。

③、视频加密—video_engine_encryption

视频加密是 WebRTC 的 video_engine 一部分,相当于视频应用层面的功能,给点对点的视频双方提供了数据上的安全保证,可以防止在 Web 上视频数据的泄漏。

视频加密在发送端和接收端进行加解密视频数据,密钥由视频双方协商,代价是会影响视频数据处理的性能;也可以不使用视频加密功能,这样在性能上会好些。

④、视频媒体文件—media_file

源代码在 webrtc\modules\media_file 目录下。

该功能是可以用本地文件作为视频源,有点类似虚拟摄像头的功能;支持的格式有 Avi,另外 WebRTC 还可以录制音视频到本地文件,比较实用的功能。

⑤、视频图像处理—video_processing

源代码在 webrtc\modules\video_processing 目录下。

视频图像处理针对每一帧的图像进行处理,包括明暗度检测、颜色增强、降噪处理等功能,用来提升视频质量。

⑥、视频显示—video_render

源代码在 webrtc\modules\video_render 目录下。

在 windows 平台,WebRTC 采用 direct3d9 和 directdraw 的方式来显示视频,只能这样,必须这样。

⑦、网络传输与流控

对于网络视频来讲,数据的传输与控制是核心价值。WebRTC 采用的是成熟的 RTP/RTCP 技术。

2、音频相关

WebRTC 的音频部分,包含设备、编解码(iLIBC/iSAC/G722/PCM16/RED/AVT、 NetEQ)、加密、声音文件、声音处理、声音输出、音量控制、音视频同步、网络传输与流控(RTP/RTCP)等功能。

①、音频设备—audio_device

源代码在 webrtc\modules\audio_device\main 目录下, 包含接口和各个平台的源代码。

在 windows 平台上,WebRTC 采用的是 Windows Core Audio 和 Windows Wave 技术来管理音频设备,还提供了一个混音管理器。

利用音频设备,可以实现声音输出,音量控制等功能。

②、音频编解码—audio_coding

源代码在 webrtc\modules\audio_coding 目录下。

WebRTC 采用 iLIBC/iSAC/G722/PCM16/RED/AVT 编解码技术。

WebRTC 还提供 NetEQ 功能—抖动缓冲器及丢包补偿模块,能够提高音质,并把延迟减至最小。

另外一个核心功能是基于语音会议的混音处理。

③、声音加密—voice_engine_encryption

和视频一样, WebRTC 也提供声音加密功能。

④、声音文件

该功能是可以用本地文件作为音频源,支持的格式有 Pcm 和 Wav。

同样,WebRTC 也可以录制音频到本地文件。

⑤、声音处理—audio_processing

源代码在 webrtc\modules\audio_processing 目录下。

声音处理针对音频数据进行处理,包括回声消除(AEC)、AECM(AEC Mobile)、自动增益(AGC)、降噪(NS)、静音检测(VAD)处理等功能, 用来提升声音质量。

⑥、网络传输与流控

和视频一样,WebRTC 采用的是成熟的 RTP/RTCP 技术。

四、WEBRTC 调用本地摄像头

WebRTC 是“ 网络实时通信” ( Web Real Time Communication)的缩写,它主要用来让浏览器实时获取和交换视频、音频和数据。

1、确认本地设备

列出 Windows 系统上可用的音视频设备

ffmpeg -list_devices true -f dshow -i dummy

-list_devices true:这是一个选项参数,用于告诉 FFmpeg 列出可用的设备。-f dshow:这是另一个选项参数,用于指定使用 DirectShow 框架来访问设备。-i dummy:这是输入参数,dummy 是一个虚拟设备名称,用于触发设备列表的输出。

在这里插入图片描述

可以看到笔记本电脑只有个前置摄像头,未外接 USB 摄像头

下面命令使用前置摄像头进行捕捉画面:

<code>ffplay -f dshow -i video="Integrated Camera"code>

在这里插入图片描述

2、WebRTC 所用 API

WebRTC 共分三个 API:

MediaStream(又称 getUserMedia)RTCPeerConnectionRTCDataChannel

getUserMedia 主要用于获取视频和音频信息,后两个 API 用于浏览器之间的数据交换。

①、getUserMedia

首先,检查浏览器是否支持 getUserMedia 方法。

<code>navigator.getUserMedia ||

(navigator.getUserMedia = navigator.mozGetUserMedia || navigator.webkitGetUserMedia

|| navigator.msGetUserMedia);

if (navigator.getUserMedia) {

//do something

} else {

console.log('your browser not support getUserMedia');

}

Chrome21 、Opera 18 和 Firefox 17 支 持 该 方 法 ,目 前 IE 还 不 支 持 ,上 面 代 码 中 的 msGetUserMedia 只是为了确保将来的兼容。

getUserMedia(streams, success, error); 含义如下:

streams:表示包括哪些多媒体设备的对象success:回调函数,获取多媒体设备成功时调用error:回调函数,获取多媒体设备失败时调用

用法如下:

navigator.getUserMedia({

video: true,

audio: true

}, onSuccess, onError);

上面的代码用来获取摄像头和麦克风的实时信息。

如果网页使用了 getUserMedia,浏览器就会询问用户,是否许可提供信息。如果用户拒绝,就调用回调函数 onError。

发生错误时,回调函数的参数是一个 Error 对象,它有一个 code 参数,取值如下:

PERMISSION_DENIED:用户拒绝提供信息。NOT_SUPPORTED_ERROR:浏览器不支持指定的媒体类型。MANDATORY_UNSATISHIED_ERROR:指定的媒体类型未收到媒体流。

②、展示摄像头图像

将用户的摄像头拍摄的图像展示在网页上,需要先在网页上放置一个 video 元素。图像就展示在这个元素中。

<video id="webcam"></video>code>

然后, 用代码获取这个元素。

function onSuccess(stream) {

var video = document.getElementById('webcam');

//more code

}

最后,将这个元素的 src 属性绑定数据流,摄像头拍摄的图像就可以显示了。

function onSuccess(stream) {

var video = document.getElementById('webcam');

if (window.URL) {

video.src = window.URL.createObjectURL(stream);

} else {

video.src = stream;

}

video.autoplay = true;

//or video.play();

}

它的主要用途是让用户使用摄像头为自己拍照。

3、Html 与 js 代码

webrtcdemo.html

<!DOCTYPE html>

<html >

<head>

<meta charset="UTF-8">code>

<meta name="viewport" content="width=device-width, initial-scale=1.0">code>

<meta http-equiv="X-UA-Compatible" content="ie=edge">code>

<title>Document</title>

</head>

<body>

<div>

<button id="start">开始</button>code>

<button id="stop">停止</button>code>

</div>

<div>

<video autoplay controls id="id__stream"></video>code>

</div>

<script>

// 只获取视频

let constraints = { audio: false, video: true};

let startBtn = document.getElementById('start')

let stopBtn = document.getElementById('stop')

let videoShowControl = document.getElementById('id__stream')

startBtn.onclick = function() {

navigator.getUserMedia(constraints, function(stream) {

videoShowControl.srcObject = stream;

window.stream = stream;

}, function(err) {

console.log(err)

})

}

stopBtn.onclick = function() {

videoShowControl.pause();

}

</script>

</body>

</html>

4、WEBRTC 调用本地摄像头

双击 webrtcdemo.html 可以看到下图界面,点击开始

在这里插入图片描述

点击允许

在这里插入图片描述

可以看到电脑摄像头捕捉到的图像

在这里插入图片描述


我的qq:2442391036,欢迎交流!




声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。