WebRTC开发基础(WebRTC入门系列1:getUserMedia)

2024-02-01 04:18

本文主要是介绍WebRTC开发基础(WebRTC入门系列1:getUserMedia),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是WebRTC

WebRTC由IETF(Internet Engineering Task Force——互联网工程任务组)和W3C(World Wide Web Consortium——万维网联盟)联合负责其标准化工作。IETF定制WebRTC的互联网基础协议标准,该标准也被称为RTCWeb(Real-Time Communication in Web-browsers)。W3C则负责定制WebRTC的客户端JavaScript API接口的标准。目前参与该技术标准定制的公司主要有思科、微软、谷歌、苹果、爱立信、Intel等。

WebRTC(Web Real-Time Communication——网页实时通信)是一个基于浏览器的实时多媒体通信技术。该项技术旨在使Web浏览器具备实时通信能力;同时,通过将这些能力封装并以JavaScript API的方式开放给Web应用开发人员,使得Web应用开发人员能够通过HTML标签和JavaScript API快速地开发出基于Web浏览器的实时音视频应用,而无需依赖任何第三方插件。谷歌2011年6月3日宣布向开发人员开放WebRTC架构的源代码。

 

WebRTC的影响和前景

  WebRTC技术的快速普及将对现有的很多领域产生巨大的影响。 首先,受到影响的是现有的VoIP业务领域。目前我们正在经历一个硬件多样化的时代,比如可穿戴设备的兴起。这将促进适应新型设备的操作系统的涌现和加大现有操作系统的分化。因此,操作系统的异构性和繁杂性使得VoIP应用的开发、更新与维护的复杂性和成本剧增。随着WebRTC集成到浏览器中,基于Web的实时通信应用可以通过HTML标签和JavaScript API实现快速的开发,并避免了由于操作系统的异构性带来的重复开发和由于版本升级带来的维护费用以及不便。这将导致现有的应用开发人员从现有的基于浏览器插件或者原生VoIP应用模式转向使用WebRTC进行Web应用开发,进而使得现有的VoIP应用的普通用户向基于浏览器的Web应用的迁移。目前,涉及VoIP业务的客服以及在线教育领域很关注WebRTC技术在自身领域的应用。

  其次,现有的IM应用通过其拥有的大量用户,并通过构建在这些IM应用上的衍生应用形成生态圈。这些IM应用及其所形成的生态圈正在试图取代浏览器成为互联网入口。这种现象在移动智能终端表现的更加突出。然而,如上文所述,WebRTC技术的部署和使用将呈现爆炸式的增长,这将导致IM应用向IM Web应用的转变和用户向IM Web应用的迁移。因此,构建在现有IM应用的生态圈将被打破。现有的IM应用及其生态圈必将做出相应的布局调整以适应新的技术环境。

  同时,WebRTC的普及将给企业带来监管和安全问题。目前,有些公司在公司内部封锁了IM应用(比如QQ,Skype)的端口,以防止员工在工作过程中由于对音视频工具的不慎使用所造成的安全问题。基于WebRTC的新型IM Web应用,与正常的Web页面无异,所以很难检测该种IM Web应用。这给企业的监管和安全造成了巨大的隐患。

  其次,智能电视的展现形式和业务模式将受到巨大的影响。目前,智能电视主要包括智能操作系统以及显示设备。在智能电视上的主要业务也主要是对多媒体源的直播和点播。随着WebRTC的普及和涌现大量的IM Web应用,智能电视将很可能原生的包含摄像头设备。同时,视频会议业务也将像现在的对多媒体源的直播和点播业务一样,成为智能电视的主要业务。

  其次,所上文所述,由于WebRTC所支持的音视频格式的局限,以及WebRTC在多人视频会话中采用的可选网状结构的限制(目前是6人)。新型的服务供应商将产生。这些供应商主要提供1)不同视频编解码的转换;2)在多人会话中,视频流的整合与广播。目前,服务供应商及其产品有:Dialogic推出的PowerMedia XMS 2.1和英特尔推出的Collaboration Service for WebRTC。

  最后,集成了WebRTC的Web浏览器将进一步改变传统的应用、Web浏览器和操作系统的格局。Web浏览器将成为介于操作系统与Web应用的一个平台。为Web操作系统的普及进一步铺平道路。包含了WebRTC的浏览器将进一步巩固其互联网入口的地位——近些年,超级应用(例如微信)通过其拥有的大量用户和在其上的开发的衍生应用试图成为互联网入口。Web浏览器及其Web应用将成为一种生态圈。高性能浏览器的研发将成为下一个竞争热点。而浏览器的安全问题将更加凸显。

 

开发基础知识

本文大部分翻译自:

http://www.html5rocks.com/en/tutorials/webrtc/basics/

http://w3c.github.io/mediacapture-main/getusermedia.html

 

通常WebRTC程序需要实现以下需求:

  • 获得流音频,视频或其他数据。
  • 获取网络信息,如IP地址和端口,与其他WebRTC客户端(称为节点)连接通讯、交换数据,穿越NAT和防火墙。
  • 协调信令通信以报告错误、发起或关闭会话。
  • 客户端之间交换媒体和客户的信息,如分辨率和编解码器。
  • 通信流音频,视频或数据。

MediaStream API代表同步流媒体。例如,从摄像头和麦克风输入的流有同步的视频和音频曲目。(不要混淆mediastream轨道与<track>的元素,这是完全不同的东西。)

一个最简单的例子:

https://webrtc.github.io/samples/src/content/getusermedia/gum.

 

1、输入、输出

每个MediaStream具有一个输入,这可能由navigator.getUserMedia()生成;并仅具有一个输出,传递到video element或RTCPeerConnection;

2、getUserMedia参数

getUserMedia()方法需要三个参数:

  1. 约束对象Constrain,通常是配置项;
  2. 一个成功的回调,通过一个MediaStream;
  3. 一个失败的回调,失败的回调是通过一个错误对象;

3、标签label、MediaStreamTracks数组

每个MediaStream都有一个标签label,如'xk7eulhsuhkbnjlwkw4yygnjj8onsgwhbvlq”

MediaStreamTracks数组是由getAudioTracks()和getVideoTracks()方法返回。

对于https://webrtc.github.io/samples/src/content/getusermedia/gum的例子
stream.getAudioTracks()返回一个空数组(因为没有音频)。
假设获得一个网络摄像头连接,stream.getVideoTracks()将返回MediaStreamTrack数组,表示流来自摄像头
每个MediaStreamTrack只有一种类型(“视频”或“音频”),和一个标签label(类似于“FaceTime HD Camera(内置)”)代表音频或视频的一个或多个通道。
在这种情况下(没有音频),gum的例子只有一个视频轨迹和没有音频。
更多的场景:得到前置摄像头,后置摄像头,麦克风流,以及“屏幕分享screenshared ' 应用。

 4、Blob URL

Chrome or Opera中:URL.createObjectURL()方法把一个MediaStream转换到Blob URL,可以设置为video element的src。

Blob URLs原理请阅读:http://www.html5rocks.com/en/tutorials/workers/basics/#toc-inlineworkers-bloburis
在Firefox中:视频的src可以从流本身来设置。

版本M25以上,以Chrome为基础的浏览器(Chrome和Opera),允许从getUserMedia音频数据传递给音频或视频元素(但请注意,默认情况下是静音的)。

getUserMedia 允许 as an input node for the Web Audio API:

// success callback when requesting audio input stream
function gotStream(stream) {
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var audioContext = new AudioContext();
// Create an AudioNode from the stream.
var mediaStreamSource = audioContext.createMediaStreamSource( stream );
// Connect it to the destination to hear yourself (or any other node for processing!)
    mediaStreamSource.connect( audioContext.destination );
}
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
navigator.getUserMedia( {audio:true}, gotStream );

Chrome浏览器添加音频捕获和/或videoCapture权限允许权限请求,可以只授予一次,此后,用户不被要求授予照相机或麦克风访问权限。同样的,在使用HTTPS网页:也只有授予一次(在Chrome至少一次)。显示在浏览器中的信息栏的始终允许“Always Allow”按钮。

此外,Chrome将在2015年底弃用getUserMedia()的HTTP访问。在Chrome M44你已经可以看到一个警告信息。

未来MediaStream可做为任何流的数据源,而不仅仅是照相机或麦克风。例如传感器或其它输入。

一些好玩的例子:

  • Webcam Toy is a photobooth app that uses WebGL to add weird and wonderful effects to photos which can be shared or saved locally.
  • FaceKat is a 'face tracking' game built with headtrackr.js.
  • ASCII Camera uses the Canvas API to generate ASCII images.

5、Constraints 

用于设置视频分辨率getUserMedia()和RTCPeerConnection addStream()调用。
其目的是为执行其他约束,诸如宽高比,面向模式(正面或背面相机),帧率,高度和宽度......

例子:

 getUserMedia({
video: {
mandatory: { minAspectRatio: 1.333, maxAspectRatio: 1.334 },
optional [
{ minFrameRate: 60 },
{ maxWidth: 640 },
{ maxHeigth: 480 }
]
}
}, successCallback, errorCallback);
 
Dictionary MediaTrackConstraints Members
advanced of type  sequence<MediaTrackConstraintSet>

See Constraints and ConstraintSet for the definition of this element.

dictionary MediaTrackConstraintSet {

             ConstrainLong      width;
ConstrainLong      height;
ConstrainDouble    aspectRatio;
ConstrainDouble    frameRate;
ConstrainDOMString facingMode;
ConstrainDouble    volume;
ConstrainLong      sampleRate;
ConstrainLong      sampleSize;
ConstrainBoolean   echoCancellation;
ConstrainDouble    latency;
ConstrainLong      channelCount;
ConstrainDOMString deviceId;
ConstrainDOMString groupId;
};

 更多Media Capture and Streams 相关细节:

http://www.w3.org/TR/mediacapture-streams/

 

入门必读资源:

http://www.html5rocks.com/en/tutorials/webrtc/basics/

接口定义:http://w3c.github.io/mediacapture-main/getusermedia.html

javascript并发开发,必须了解Blob URLs原理:http://www.html5rocks.com/en/tutorials/workers/basics/#toc-inlineworkers-bloburis

其他Demo资源:

http://webaudiodemos.appspot.com/

https://webrtc.github.io/samples/

 

以下内容待续

  • rtcpeerconnection
  • rtcdatachannel

一个ASP.NET MVC 在线录音录像(音视频录制并上传)Demo :

http://download.csdn.net/detail/starcrm/9394037

 

 

参考链接

  • http://javascript.ruanyifeng.com/htmlapi/webrtc.html
  • Andi Smith,Get Started with WebRTC
  • Thibault Imbert, From microphone to .WAV with: getUserMedia and Web Audio
  • Ian Devlin, Using the getUserMedia API with the HTML5 video and canvas elements
  • Eric Bidelman, Capturing Audio & Video in HTML5
  • Sam Dutton, Getting Started with WebRTC
  • Dan Ristic, WebRTC data channels
  • Justin Uberti, Sam Dutton, WebRTC: Plugin-free realtime communication
  • Mozilla Developer Network, Taking webcam photos
  • Sam Dutton, WebRTC in the real world: STUN, TURN and signaling

这篇关于WebRTC开发基础(WebRTC入门系列1:getUserMedia)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/666050

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10