浅尝WebRTC拉流,实现两个小功能

您所在的位置:网站首页 webrtc拉流画面卡顿 浅尝WebRTC拉流,实现两个小功能

浅尝WebRTC拉流,实现两个小功能

2024-07-14 11:10| 来源: 网络整理| 查看: 265

浅尝WebRTC拉流,实现两个小功能 #

最近搞了个前端使用WebRTC拉取视频流,视频流是一个数字人的展示,然后通过文本输入/语音录入的方式向数字人提问的小功能。对实现的方案以及遇到的问题做一个小总结

什么是WebRTC拉流 #

WebRTC拉流是指使用WebRTC协议从服务器获取已有直播内容的过程。 WebRTC(Web Real-Time Communication)是一个支持浏览器进行实时语音、视频对话和数据传输的开源协议。在拉流过程中,主要涉及到以下步骤:

 1. 获取媒体流:拉流的第一步是获取媒体流,这些媒体流可以是摄像头、麦克风或屏幕共享的内容。在WebRTC中,通常使用getUserMedia API来获取这些媒体流。

 2. 创建RTCPeerConnection:RTCPeerConnection是WebRTC中用于处理与远程对等方之间音视频通信的关键对象。在拉流场景中,需要使用RTCPeerConnection来接收远程对等方发送的媒体流。

 3. 接收远程流:通过RTCPeerConnection,可以接收远程对等方发送的媒体流。

 4. 设置远程SDP:接收到远程SDP(会话描述协议)后,需要将其设置为远程对等方的描述,以便RTCPeerConnection知道远程对等方希望发送哪种类型的媒体流。

总的来说,WebRTC拉流允许客户端从服务器获取实时音视频数据,并在浏览器中进行解码和渲染,从而实现音视频内容的实时播放。浏览器暴露出RTCPeerConnection方法之后,手动触发一个发offer(sdp就在这个offer里面)的方法之后就可以跟服务器实时媒体流进行交互,通过setRemoteDescription从服务端接收SDP数据,两边这么一握手,诶做一个信息对等就可以进行通信了

拉流功能实现 #

定一个div,把具名为'jswebrtc'的元素创建成一个视频元素对象,从'data-url'属性中获取视频流地址

Player构造函数用于接收视频流的URL和选项作为参数,然后调用startLoading 方法用于开始加载视频流,创建RTC链接监听‘ontrack’事件,当收到视频轨道时将其赋值给视频元素,然后创建一个offer,发送给服务器等待answer,服务器answer后将服务器的answer设置为远程描述,通信完成,如果设置了autoplay 选项,则会自动播放视频。

play、pause、stop 和 destroy这些方法用于控制视频的播放、暂停、停止和销毁。

update 方法用于更新视频播放状态,通过递归调用自身来持续更新视频的播放状态。

html // 定义 JSWebrtc 对象 var JSWebrtc = { Player: null, // 播放器对象 VideoElement: null, // 视频元素对象 // 创建视频元素方法 CreateVideoElements: function () { // 获取所有具有类名 'jswebrtc' 的元素 var elements = document.querySelectorAll('.jswebrtc'); // 遍历元素数组 for (var i = 0; i = 0) query_string = query_string.split('?')[1]; // 将查询字符串按 '&' 分割为数组 var queries = query_string.split('&'); // 遍历查询数组 for (var i = 0; i = 0) { var params = app.substr(app.indexOf('?')); app = app.substr(0, app.indexOf('?')); if (params.indexOf('vhost=') > 0) { vhost = params.substr(params.indexOf('vhost=') + 'vhost='.length); if (vhost.indexOf('&') > 0) { vhost = vhost.substr(0, vhost.indexOf('&')); } } } // 如果主机名为 IP 地址,则将 vhost 设置为默认值 if (a.hostname == vhost) { var re = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/; if (re.test(a.hostname)) vhost = '__defaultVhost__'; } // 设置协议、端口和返回对象 var schema = 'rtmp'; if (rtmp_url.indexOf('://') > 0) schema = rtmp_url.substr(0, rtmp_url.indexOf('://')); var port = a.port; if (!port) { if (schema === 'http') { port = 80; } else if (schema === 'https') { port = 443; } else if (schema === 'rtmp') { port = 1935; } else if (schema === 'webrtc' || schema === 'rtc') { port = 1985; } } // 构建返回对象 var ret = { url: rtmp_url, schema: schema, server: a.hostname, port: port, vhost: vhost, app: app, stream: stream, }; // 填充查询参数到返回对象中 JSWebrtc.FillQuery(a.search, ret); return ret; }, // 发起 HTTP POST 请求方法 HttpPost: function (url, data) { // 返回一个 Promise 对象 return new Promise(function (resolve, reject) { // 创建 XMLHttpRequest 对象 var xhr = new XMLHttpRequest(); // 监听状态改变事件 xhr.onreadystatechange = function () { // 请求完成且状态码为成功时 if (xhr.readyState === 4 && xhr.status >= 200 && xhr.status


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3