webrtc-RTP Media

/post/webrtc-RtpMedia article cover image

rtp-media结构体

ice candidate

receiver--sender

  • getReceivers 获取一组RTCRtpReceiver对象,用于接收数据
  • getSenders 获取一组RTCRtpSender对象,用于发送数据,每个对象对应一个媒体轨

共有属性

  • MediaStreamTrack 媒体轨
  • RTCDtlsTransport Transport媒体数据传输相关的属性
  • RTCDtlsTransport rtcpTransport与rtcp传输相关的属性

rtcrtpreceiver

  • getParameters 返回RTCRtpParameter对象(接收器的参数)
  • getSynchronizationSources 返回一组SynchronizationSources实例(共享源)
  • getContributingSources 返回一组getContributingSources实例(混音混频)
  • getStats RTCStasReport,里面包括输入流统计信息
  • getCapabilities 返回系统能接受的媒体能力(音频、视频)

rtcrtpsender

  • getParameters 返回RTCRtpParameter对象(接收器的参数)
  • setParameters 设置RTP传输相关的参数
  • getStats 提供了输出流的统计数据
  • replaceTrack 用另一个track替换现在的track,如切换摄像头
  • getCapabilities 按类型(音频、视频)返回系统发送媒体的能力

rtcrtptransceiver

属性

  • getTransceivers 从PC获得一组RTCPRtpTransceiver对象,每个RTCRtpTransceiver是RTCRtpSender和RTCRtpReceiver对

方法

  • stop 停止发送和接收媒体数据

控制传输速率

<Callout type="info"> 参考mdn文档:<a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/RTCRtpSender/getParameters">getParameters</a> </Callout>

js
const BAND_WIDTH = 1000;
const senders = pc.getSenders();
const videoSender = senders.find(item => item.track.kind === 'video');
const parameters = videoSender.getParameters();

if (parameters.encodings){
	parameters.encodings[0].maxBitrate = BAND_WIDTH * 1000;
	videoSender.setParameters(parameters)
						.then(()=>{
							// ...
						})
						.catch(err => {
							// ...
						});
}

统计信息

<Callout type="info"> 参考mdn文档:<a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/RTCRtpSender/getStats">getStats</a> </Callout>

js
const senders = pc.getSenders();
const videoSender = senders.find(item => item.track.kind === 'video');

let lastResult;

function makeStats() {
	videoSender.getStats()
		.then(reports => {
		// 统计发送
		const outReports = reports.filter(item => item.type === 'outbound-rtp');
		outReports.forEach(report => {
			const { timestamp, bytesSent, packetSent } = report;

			if (lastResult && lastResult.has(report.id)) {
				// 通过统计数据计算码率
				const bitrate = 8 * (bytesSent - lastResult.get(report.id).bytesSent) / (now - lastResult.get(report.id).timestamp);
				// 其他统计
			}
		})

		lastResult = reports;
		})
		.catch(err => {
		// ...
		})
}