WebRTC播放组件之 srs.sdk.js 使用与详述

1、简介

webrtc流媒体的播放,本质上也是基于建立端到端的RTC连接、接收推送过来的视频流数据的过程。webrtc流地址本质上就具有很强的规则性,其中包含信令服务器地址、基本参数等。

SRS(Simple Real-Time Media Server)是一个强大的开源的流媒体服务器, webrtcs视频流的播放本身就是一个订阅(播放)的过程,因此 SRS 源码中自然包含播放的代码,即 srs.sdk.js

srs.sdk.js 是基于 SRS 实时视频服务器、对浏览器支持的 WebRTC 基础功能的封装。

2、使用

2.1、引入

  • 从官网下载好 srs.sdk.js 文件,将此文件放入项目中的静态文件夹;
  • 通过 CDN 方式引入,即 例: <script src="./static/webrtc/srs.sdk.js"></script>
  • 暴露出实现函数 SrsRtcPlayerAsync 

2.2、函数说明

  1. 通过构造函数 SrsRtcPlayerAsync 实例化出对象(本文用 sdk 定义),
  2. 对象的属性:pc -- RTCPeerConnection() 实例化对象;stream -- 实例化MediaStream()对象
  3. 对象的方法:play() -- 初始化播放的代码;close() -- 关闭播放的方法

2.3、基本实现代码

下面是基本的实现代码,在 vue 中的写法

    <video 
        width="100%" 
        height="100%" 
        autoplay 
        muted 
        class="screen-full-db" 
        :id="`webrtc-video-${uid}`"
    ></video>
            // 获取实例化对象,参数传入失败回调函数
            this.sdk = new SrsRtcPlayerAsync(this.sdkInitError);
            // 监听 webrtc 建立状态
            this.sdk.pc.addEventListener("iceconnectionstatechange", data => {
                if (data.target.iceConnectionState == "disconnected") {
                    this.$emit("disconnected");
                }
            });
            // 将获取的视频流 给 video 的 srcObject
            $(`#webrtc-video-${this.uid}`).prop("srcObject", this.sdk.stream);

            // 初始化代码
            try {
                // play() 初始化播放代码,参数:webrtc流地址
                this.sdk.play(this.src).then(
                    res => {}
                )
            } catch (error) {
                // 错误回调

            }

            // 关闭播放器
            this.sdk.close();

再简化一下:

        let sdk = new SrsRtcPlayerAsync(sdkInitErrorCallback);
        $(`#webrtc-video-id`).prop("srcObject", sdk.stream);
        sdk.play(src)

基本实现就基本完成了,十分的简单简便。

3、源码简述

这一部分会源码进行基本的介绍,源码也是十分的通俗易懂。

 3.1、基本结构

        function SrsRtcPlayerAsync() {
            var self = {};

            // Close the player.
            self.play = async function (url) { }

            // The callback when got remote track.
            // Note that the onaddstream is deprecated, @see https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/onaddstream
            self.ontrack = function (event) {}

            // Internal APIs.
            self.__internal = {}

            self.pc = new RTCPeerConnection(null);

            // Create a stream to add track to the stream, @see https://webrtc.org/getting-started/remote-streams
            self.stream = new MediaStream();

            // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/ontrack
            self.pc.ontrack = function (event) {}
            return self;
        }

函数的基本结构没什么好讲的,主要注意一个小tip,通过实例化去 new 这个函数,函数有返回值且为引用类型,实例化对象就是返回的对象。

3.2、play 方法

主要看 play 方法具体如何实现:

            self.play = async function (url) {
                var conf = self.__internal.prepareUrl(url);
                self.pc.addTransceiver("audio", { direction: "recvonly" });
                self.pc.addTransceiver("video", { direction: "recvonly" });
                //self.pc.addTransceiver("video", {direction: "recvonly"});
                //self.pc.addTransceiver("audio", {direction: "recvonly"});

                var offer = await self.pc.createOffer();
                await self.pc.setLocalDescription(offer);
                var session = await new Promise(function (resolve, reject) {
                    // @see https://github.com/rtcdn/rtcdn-draft
                    var data = {
                        api: conf.apiUrl, tid: conf.tid, streamurl: conf.streamUrl,
                        clientip: null, sdp: offer.sdp
                    };
                    console.log("Generated offer: ", data);

                    const xhr = new XMLHttpRequest();
                    xhr.onload = function () {
                        if (xhr.readyState !== xhr.DONE) return;
                        if (xhr.status !== 200 && xhr.status !== 201) return reject(xhr);
                        const data = JSON.parse(xhr.responseText);
                        console.log("Got answer: ", data);
                        return data.code ? reject(xhr) : resolve(data);
                    }
                    xhr.open('POST', conf.apiUrl, true);
                    xhr.setRequestHeader('Content-type', 'application/json');
                    xhr.send(JSON.stringify(data));
                });
                await self.pc.setRemoteDescription(
                    new RTCSessionDescription({ type: 'answer', sdp: session.sdp })
                );
                session.simulator = conf.schema + '//' + conf.urlObject.server + ':' + conf.port + '/rtc/v1/nack/';

                return session;
            };
  1. 一开始调用 __internal 对象中 prepareUrl 方法,通过 webrtc 流地址解析得到信令服务器URL地址,从而完成媒体协商。前面说过webrtc的流地址是规则性很强的,在SRS的源码里面体现了。这里如果信令服务器不是通过webrtc地址获取的,可以自行在代码中修改。
  2. 获取本地SDP,开始媒体协商请求,拿到远程SDP,并设置。
  3. 返回SDP信息。

3.3、ontrack

            self.pc.ontrack = function (event) {
                if (self.ontrack) {
                    self.ontrack(event);
                }
            };
            self.ontrack = function (event) {
                // https://webrtc.org/getting-started/remote-streams
                self.stream.addTrack(event.track);
            };

pc.ontrack 回调事件监听媒体流数据,并添加track到stream。

webrtc 播放还可以使用 jswebrtc.js 库,可看:WebRTC播放组件之 jswebrtc 使用与详述

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值