WebRTC播放组件之 jswebrtc 使用与详述

  •  前言:jswebrtc 作为 WebRTC 常用的播放库,已经有不少文章介绍他的使用方法,本文目的在尽可能详尽的介绍 总结 介绍 jswebrtc 的用法以及对库源代码的简单介绍。 

1、简介

2、使用

2.1、引入

在上面的地址中将代码下载,找到 jswebrtc.min.js 文件,并将文件通过<script>引入就行

通过 gitee 下载的,文件在 dist/ 文件夹下面

2.2、基本使用


    let webrtcPlayer = new JSWebrtc.Player(url, {
        video: video,
        autoplay: true,
        onPlay: obj => {},
        onPause:obj => {}
      })

调用 JSWebrtc 对象的 Player 方法,实例化一个播放器对象。

参数包括 url 和 option

  • url:  webrtc 流地址(格式:例;webrtc://xxxx:xxx/xxx/xxx,如果不是以 webrtc:// 开头的格式会报错:JSWebrtc just work with webrtc) 
  • option:配置项对象,包括:
  • video :播放标签元素:不传会报错:VideoElement is null

  • autoplay:是否自动播放

  • onPlay:播放时回调

  • onPause:暂停时回调

主要方法: 

方法说明
play()播放方法

pause()

暂停

stop()

暂停,跟 pause() 用法一样

destroy()

销毁

 以上就是 jswebrtc 这个库播放 webrtc 流的方法,就是这么简单。

2.3、第二种使用方式

通过查看 jswebrtc 源代码之后,发现其实 它提供了第二种 基于元素标签 data-set 集的方法,但是使用起来没有第一种方便,所以这里将这种方法做下记录,还是推荐使用 2.2 中的基本方法。

此方法仅做了解即可,可不看直接跳过。

先看这个标签:

<div class="jswebrtc"  data-url="url" data-autoplay="true" data-on-play="onplay"></div>
  • 必须要有 类名为 jswebrtc 的类,可以有多个
  • data-后面的值对应其 JSWebrtc 对象的 Player 的参数及配置项
  • 拿到 element 的元素,元素上有 element.playerInstance 属性就是一个 实例化出的 JSWebrtc 对象的 Player
  • element.playerInstance 可以拿到所有方法

如果对这个方法感兴趣的可以一起看下面源码的介绍(如果发现讲的不对的希望指正,共同学习

3、源码介绍

这里就不贴源码了,感兴趣的可自行去 gitee 查看,如果只是使用, 这部分可以 略过 。

3.1、结构

通过 gitee 查看项目: dist/ 是压缩打包之后的代码,源代码在 src/ 文件夹下面:

全局对象 JSWebrtc,Player 与 VideoElement 为 JSWebrtc 方法。

3.2、Player

主要看 palyer.js ,截取初始化的代码:

        JSWebrtc.Player = function () {
            "use strict";
            var Player = function (url, options) {
                this.options = options || {};
                if (!url.match(/^webrtc?:\/\//)) {
                    throw "JSWebrtc just work with webrtc"
                }
                if (!this.options.video) {
                    throw "VideoElement is null"
                }
                this.urlParams = JSWebrtc.ParseUrl(url);
                this.pc = null;
                this.autoplay = !!options.autoplay || false;
                this.paused = true;
                if (this.autoplay) this.options.video.muted = true;
                this.startLoading()
            };

            // -------***------------
            return Player
        }

new JSWebrtc.Player() 本质就是先调用JSWebrtc.Player方法,返回一个构造函数,然后实例化它,上面的代码对 url 和 options 做了校验,所以为什么有时候会出现报错。

下面是 webrtc 连接并获取流媒体播放的主要代码,这里贴一下:

        Player.prototype.startLoading = function () {
            var _self = this;
            if (_self.pc) {
                _self.pc.close()
            }
            _self.pc = new RTCPeerConnection(null);
            _self.pc.ontrack = function (event) {
                _self.options.video["srcObject"] = event.streams[0]
            };
            _self.pc.addTransceiver("audio", {
                direction: "recvonly"
            });
            _self.pc.addTransceiver("video", {
                direction: "recvonly"
            });
            _self.pc.createOffer().then(function (offer) {
                return _self.pc.setLocalDescription(offer).then(function () {
                    return offer
                })
            }).then(function (offer) {
                return new Promise(function (resolve, reject) {
                    var port = _self.urlParams.port || 1985;
                    var api = _self.urlParams.user_query.play || "/rtc/v1/play/";
                    if (api.lastIndexOf("/") != api.length - 1) {
                        api += "/"
                    }
                    var url = "http://" + _self.urlParams.server + ":" + port + api;
                    for (var key in _self.urlParams.user_query) {
                        if (key != "api" && key != "play") {
                            url += "&" + key + "=" + _self.urlParams.user_query[key]
                        }
                    }
                    var data = {
                        api: url,
                        streamurl: _self.urlParams.url,
                        clientip: null,
                        sdp: offer.sdp
                    };
                    // console.log("offer: " + JSON.stringify(data));
                    JSWebrtc.HttpPost(url, JSON.stringify(data)).then(function (res) {
                        // console.log("answer: " + JSON.stringify(res));
                        resolve(res.sdp)
                    }, function (rej) {
                        reject(rej)
                    })
                })
            }).then(function (answer) {
                return _self.pc.setRemoteDescription(new RTCSessionDescription({
                    type: "answer",
                    sdp: answer
                }))
            }).catch(function (reason) {
                throw reason
            });
            if (this.autoplay) {
                this.play()
            }
        };

方法中包含一个长串的链式调用,逐步来看

  • 先通过 new RTCPeerConnection(null) 创建连接实例对象pc ,并添加进 Player 的实例化对象身上。
  • pc.ontrack 回调事件监听媒体流数据,并通过video.srcObject 播放

  • pc.createOffer() 创建本地媒体协商信息 SDP offer, 获取成功之后 通过pc.setLocalDescription 进行本地设置 

  • 接下来的回调主要通过 HttpPost 将 SDP offer 发送到信令服务器,完成媒体协商。 

  • 媒体协商完成后通过 pc.setRemoteDescription 进行远程设置  

  • 以上就完成了 一次 webrtc 端到端的连接

其他方法可以查看源码了解,代码很通俗易懂。

3.3、VideoElement

简单介绍一下这个对象,主要实现代码缩减之后贴一下:

        var JSWebrtc = {
            CreateVideoElements: function () {
                var elements = document.querySelectorAll(".jswebrtc");
                for (var i = 0; i < elements.length; i++) {
                    new JSWebrtc.VideoElement(elements[i])
                }
            },
        }


        JSWebrtc.VideoElement = function () {
            "use strict";
            var VideoElement = function (element) {
                var url = element.dataset.url;
                if (!url) {
                    throw "VideoElement has no `data-url` attribute"
                }
                this.container = element;
                this.video = document.createElement("video");
                this.video.width = 960;
                this.video.height = 540;

                this.container.appendChild(this.video);
                var options = {
                    video: this.video
                };
                for (var option in element.dataset) {
                    try {
                        options[option] = JSON.parse(element.dataset[option])
                    } catch (err) {
                        options[option] = element.dataset[option]
                    }
                }
                this.player = new JSWebrtc.Player(url, options);
                element.playerInstance = this.player;
            };
            return VideoElement
        }();

基本实现在贴出来的代码直接可以读出来,这里不赘述了,另外这个对象上内置了一下例如开始暂停的按钮,有兴趣可以看看代码,自己运行下。

4、总结

这个库的使用其实很简单,只需要掌握 2.1、  2.2 里面的内容,其他的都是做的一些拓展。

参考及引用:

 webRtc 流媒体播放-vue

一文详解 WebRTC 基础

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WebRTC(Web实时通信)是一种实时通信技术,主要用于在浏览器之间进行音视频通信。然而,WebRTC并不直接支持RTSP(实时流传输协议)。要在浏览器中播放RTSP视频流,你需要经过一些额外的步骤。 一种常见的方法是使用服务器端转换将RTSP流转换为WebRTC流。这可以通过使用媒体服务器(如Kurento、Janus或GStreamer)来实现。首先,你需要将RTSP流导入到媒体服务器中,然后使用WebRTC将其传送到浏览器。可以通过使用JavaScript库(如mediasoup、SimpleWebRTCwebrtc.js)来实现WebRTC的客户端部分。 以下是一个大致的步骤概述: 1. 设置媒体服务器:选择一个适合你需求的媒体服务器,并按照其文档进行安装和配置。 2. 导入RTSP流:使用媒体服务器提供的API或命令行界面,将RTSP流导入到媒体服务器中。这可能涉及到指定RTSP流的URL、设置解码参数等。 3. 设置WebRTC客户端:在浏览器中创建一个WebRTC客户端,以接收来自媒体服务器的流并播放。你可以使用JavaScript库来简化这个过程。 4. 连接与播放:通过WebRTC客户端与媒体服务器建立连接,并将媒体流传送到浏览器中进行播放。你可以根据需要自定义播放界面和控制逻辑。 需要注意的是,这个过程涉及到一些复杂的技术和配置。如果你对WebRTC和媒体服务器不太熟悉,可能需要花一些时间学习和实践。此外,不同的媒体服务器和库可能有不同的实现方式和要求,因此请参考它们的官方文档和示例代码以获取详细信息。 希望这些信息对你有所帮助!如有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值