Web RTP 收发管理器
作者:追风剑情 发布于:2024-2-29 15:12 分类:Unity3d
➤ RTP 收发管理器
RTCRtpTransceiver 唯一对应一个媒体轨道,包含了一个连接对: RTCRtpSender和RTCRtpReceiver,还包含了管理连接的属性和方法。
WebRTC 在以下几种情况创建 RTCRtpTransceiver,作为属性成员也同时创建了RTCRtpSender 和RTCRtpReceiver。
- 当调用 addTrack() 方法向 RTCPeerConnection 添加媒体轨道时,默认创建 RTCRtpTransceiver。
- 当对等端SDP包含了媒体描述信息,并被成功应用时,默认创建RTCRtpTransceiver。
- 当收到调用方法 addTransceiver() 时。
RTCRtpTransceiver 类 | |
属性 | 描述 |
currentDirection | (只读)。该属性表示当前的传输方向,类型为 RTCRtpTransceiverDirection。 |
direction |
该属性用于指定传输方向,可读写,类型为 RTCRtpTransceiverDirection。 为该属性赋值时,如果成功,则会触发 negotiationneeded 事件,表示当前连接需要重新进行协商;如果失败,则抛出异常 InvalidStateError,表示当前连接处于关闭状态。 调用方法 RTCPeerConnection.createOffer() 或 RTCPeerConnection.createAnswer() 创建SDP 信息时,会在 SDP 中包含该值,如果该值是 sendrecv,则 SDP 中会出现如下一行代码。 a=sendrecv |
mid | (只读)。该属性是连接对的唯一标识,该值从 SDP 信息中获取,如果值为 null,表示 ICE 协商还没有完成。 |
receiver | (只读)。该属性表示 RTCRtpReceiver 对象,用于接收和解码媒体流数据。 |
sender | (只读)。该属性表示 RTCRtpSender 对象,用于发送和编码媒体流数据。 |
方法 | 描述 |
setCodecPreferences() |
该方法用于设置编码格式。 参数:codecs,RTCRtpCodecCapability 对象的数组。 返回值:无。 异常:InvalidAccessError: codecs 数组里包含了当前浏览器不支持的编码格式。 |
stop() |
该方法用于停止传输通道,同时停止与通道相连的 RTCRtpSender 和 RTCRtpReceiver。 输入值:无。 返回值:无。 异常:InvalidStateError,当 RTCPeerConnection 处于关闭状态时,抛出此异常。 |
➤ RTP 发送器
RTCRtpSender 提供了媒体数据编码及发送能力,当调用 addTrack() 方法添加媒体轨道时,会相应创建一个 RTCRtpSender,用于该媒体发送 RTP 数据。
RTCRtpSender 属性 | |
属性 | 说明 |
track | 只读。该属性表示与 RTCRtpSender 相连的媒体流轨道,类型为 MediaStreamTrack。 |
dtmf | 只读。该属性表示与 RTCRtpSender 相连的 RTCDTMFSender 对象。 |
transport | 只读。该属性表示与 RTCRtpSender 相连的 RTCDtlsTransport 对象,用于安全传输媒体流数据。 |
RTCRtpSender 方法
1.getCapabilities() 静态方法
该方法用于获取平台的发送能力。
const rtpSendCapabilities = RTCRtpSender.getCapabilities(kind)
参数: kind,取值 video 或 audio,分别表示视频和音频。
返回值: RTCRtpCapabilities 对象,如果平台不具备 kind 类型的发送能力,则返回 null。
// RTCRtpCapabilities 的定义
dictionary RTCRtpCapabilities {
required sequence<RTCRtpCodecCapability> codecs;
required sequence<RTCRtpHeaderExtensionCapability> headerExtensions;
};
RTCRtpCapabilities 的属性 codecs 是一个数组,包含了多个类型为 RTCRtpCodecCapability 的编码格式(codec)。
// RTCRtpHeaderExtensionCapability 的定义
dictionary RTCRtpHeaderExtensionCapability {
DOMString uri;
};
RTCRtpHeaderExtensionCapability 包含了一个属性 uri,用于表明 RTP头扩展的地址。
2.getParameters() 方法
该方法用于获取 RTP 媒体编码及传输信息。
const rtpSendParameters = rtpSender.getParameters()
参数:无。
返回值: RTCRtpSendParameters 对象。
// RTCRtpSendParameters 的定义
dictionary RTCRtpSendParameters : RTCRtpParameters {
required DOMString transactionId;
required sequence<RTCRtpEncodingParameters> encodings;
}
// RTCRtpParameters 的定义
dictionary RTCRtpParameters {
required sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
required RTCRtcpParameters rtcp;
required sequence<RTCRtpCodecParameters> codecs;
}
RTCRtpSendParameters 属性说明 | |
属性 | 说明 |
transactionId | 参数集的 ID 值 |
encodings | RTCRtpEncodingParameters 对象数组,包含了媒体编码参数 |
headerExtensions | RTP 头扩展 |
rtcp | RTCP参数 |
codecs | 包含媒体编码格式的数组,RTP 发送器将从中选择使用 |
// RTCRtcpParameters 的定义
dictionary RTCRtcpParameters {
DOMString cname;
boolean reducedsize;
}
其中,cname 是指 RTCP 的规范名称,reducedSize 是一个布尔值,当使用了缩减 RTCP 时,值为 true;当使用了复合 RTCP 时,值为 false。
// RTCRtpHeaderExtensionParameters 的定义
dictionary RTCRtpHeaderExtensionParameters {
required DOMString uri;
required unsigned short id;
boolean encrypted = false;
}
其中,uri指 RTP 头扩展的地址,id 指头扩展的标识,encrypted 指头扩展是否使用了压缩。
下面的代码清单演示了调用getParameters0方法获取RTP发送器的参数,将第一个编码设置为不活跃状态,然后调用 setParameters 设置修改后的参数。
async function updateParameters() {
try {
const params = sender.getParameters();
// 将第一个编码设置为不活跃
params.encodings[0].active = false;
await sender.setParameters(params);
} catch (err) {
console.error(err);
}
}
3.setParameters() 方法
该方法更新 RTP 编码及传输信息。
const promise = rtpSender.setParameters(parameters)
参数: parameters,类型为 RTCRtpSendParameters。
返回值: Promise 值。
异常: 如果失败,返回异常值如下表所示。
setParameters 异常说明 | |
异常 | 说明 |
InvalidModificationError | 修改 encodings 失败 |
InvalidStateError | RTP发送器所在的 RTCRtpTransceiver 处于非活跃状态 |
RangeError | parameters 中指定的 scaleResolutionDownBy 小于1 |
OperationError | 其他原因导致的失败 |
4.replaceTrack() 方法
该方法用于替换媒体流轨道。传入ReplaceTrack()的轨道必须添加进发送流,否则替换会导致传输中断。可以先将新track添加进发送流,再调用ReplaceTrack()方法,也可以先调用ReplaceTrack()方法再添加进发送流。
替换媒体流轨道通常不需要进行 ICE 重新协商,以下场景除外。
- 新的媒体分辨率超出了现有媒体,比如新的视频分辨率更高或者更宽。
- 新的媒体帧率过高。
- 视频流轨道的预编码状态与现有轨道不同。
- 音频流轨道的通道数与现有轨道不同。
- 新的媒体源采用了硬件编码。
aPromise = rtpSender.replaceTrack(newTrack);
参数: newTrack,可选参数,新的媒体流轨道,类型为 MediaStreamTrack,kind值要与原有媒体流轨道保持一致。如果参数为空,则该调用将中止 RTP 发送器。
返回值: Promise 值,成功时无决议值; 如果失败,则返回异常值如下表所示。
replaceTrack 异常说明 | |
异常 | 说明 |
InvalidModificationError | 替换后媒体流信息发生了改变,需要重新进行ICE 协商 |
InvalidStateError | 媒体流轨道处于停止状态 |
TypeError | kind 值不一致 |
下面的代码清单演示了摄像头的切换。
navigator.mediaDevices.getUserMedia({
video: {
deviceId: {
exact: selectedCamera
}
}
}).then((stream) => {
let videoTrack = stream.getVideoTracks()[0];
PCs.forEach((pc) => {
const sender = pc.getSenders().find((s) => {
return s.track.kind == videoTrack.kind;
});
console.log('found sender:', sender);
sender.replaceTrack(videoTrack);
});
}).catch((err) => {
console.error('Error happens:',err);
});
5.getStats() 方法
该方法返回 RTP 发送器的统计数据。
const promise = rtpsender.getstats();
参数:无。
返回值:Promise值,调用成功可得到包含统计数据的 RTCStatsReport 对象。
➤ RTP 接收器
RTCRtpReceiver 属性
RTCRtpReceiver 接口负责管理媒体流的接收和解码。
1.track 只读
该属性表示 RTCRtpReceiver 相连的媒体流轨道(MediaStreamTrack)。
1.transport 只读
该属性表示 DTLS 传输对象,类型为 RTCDtlsTransport。
RTCRtpReceiver 方法
1.getCapabilities() 静态方法
该方法用于获取平台的 RTP 接收能力。
const rtpRecvCapabilities = RTCRtpReceiver.getCapabilities(kind)
参数: kind,取值为 video 或 audio,分别表示视频和音频。
返回值: RTCRtpCapabilities 对象,如果平台不具备 kind 类型的接收能力,则返回 null。
let codecList = RTCRtpReceiver.getCapabilities("audio").codecs;
2.getParameters() 方法
该方法返回 RTP 解码参数。
const rtpRecvParameters = rtcRtpReceiver.getParameters()
参数: 无。
返回值: 当前使用的解码参数,类型为 RTCRtpReceiveParameters。RTCRtpReceiveParameters 继承自 RTCRtpParameters。
3.getContributingSources() 方法
该方法返回最近 10s 内的贡献源(CSRC)。
const rtcRtpContributingSources = rtcRtpReceiver.getContributingSources()
参数: 无。
返回值: 最近 10s 内提供数据的贡献源数组,数组成员类型为 RTCRtpContributingSource。
RTCRtpContributingSource 属性说明 | |
属性 | 说明 |
timestamp | 最近一个关键帧从源发出的时间 |
source | 贡献源的 CSRC 标识 |
audioLevel | 音频音量,取值介于 0 和 1 之间 |
rtpTimestamp | RTP 数据包的时间戳 |
4.getSynchronizationSources() 方法
该方法返回最近 10s 内的同步源(SSRC)。
const rtcRtpSynchronizationSources = rtcRtpReceiver.getSynchronizationSources()
参数:无。
返回值:最近 10s 内提供数据的同步源数组,数组成员类型为 RTCRtpSynchronizationSource。
RTCRtpSynchronizationSource 继承自 RTCRtContributingSource,增加了属性 voiceActivityFlag,表示 RTP 数据包里声音是否处于活动状态,true 表示声音处于活动状态 (能听到).false 表示声音处于暂停状态 (不能听到)。
5.getStats() 方法
该方法返回 RTP 接收器的统计数据。
const promise = RTCRtpReceiver.getStats();
参数:无。
返回值: Promise 值,调用成功可得到包含统计数据的 RTCStatsReport 对象。
标签: Unity3d
日历
最新文章
随机文章
热门文章
分类
存档
- 2024年11月(3)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号