首页 > 其他分享 >SRS流媒体服务器——SRS4.0 WebRTC一对一通话环境搭建与逻辑分析

SRS流媒体服务器——SRS4.0 WebRTC一对一通话环境搭建与逻辑分析

时间:2023-01-21 10:22:48浏览次数:65  
标签:function room self SRS4.0 display SRS sig msg WebRTC

目录

  1. 环境搭建
  2. SRS4.0 WebRTC1对1通话逻辑分析

环境搭建

1. 安装go语⾔环境

  1. 在Go语言官网找到对应的安装包(https://golang.google.cn/dl/)
  2. 下载和解析(使用的是阿里云的Ubuntu系统):
cd /usr/local/
wget https://dl.google.com/go/go1.16.5.linux-amd64.tar.gz --no-check-certificate
tar -C /usr/local -xzf go1.16.5.linux-amd64.tar.gz

3.需要配置 GOROOT 和 PATH环境变量,在/etc/profile中配置。

vim /etc/profile

# 将环境变量添加到/etc/profile⽂件末尾。
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin:$GOBIN

4.然后使⽤ source /etc/profile 命令使配置文件生效,就可以在任意⽬录使用Go语⾔命令。

source /etc/profile 

5.执行go version可以查看安装go是否成功。

2. 编译和启动srs

git clone -b v4.0.123 https://gitee.com/winlinvip/srs.oschina.git
srs.4.0.123
cd srs.4.0.123/trunk
./configure
make
./objs/srs -c conf/rtc.conf

3. 编译和启动信令服务器

  1. 进行srs/trunk目录下。
cd 3rdparty/signaling
make
./objs/signaling
  1. 注意:云服务器需要先开通1989端口。

相关视频推荐:

webrtc流媒体服务器,音视频通话,推流和拉流教程_哔哩哔哩_bilibili​www.bilibili.com/video/BV16Y411P7b7/ 流媒体服务器开发,SRS 4.0与WebRTC音视频通话_哔哩哔哩_bilibili​www.bilibili.com/video/BV1TL4y1c7Hs/

LinuxC++音视频开发视频:免费】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

【文章福利】:音视频面试题、学习资料、教学视频和学习路线图资料(资料包括C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等),qun994289133免费分享,有需要的可以加群领取哦!~学习交流裙994289133加入领取资料

企鹅群994289133领取资料 企鹅群994289133领取资料

4. 编译和启动web服务器

  1. 需要server.crt和server.key,如果没有则⽤openssl⽣成。
  2. 进入srs/trunk/3rdparty/httpx-static目录,执行:
# ⽣成 server.key
openssl genrsa -out server.key 2048

# ⽣成 server.crt
openssl req -new -x509 -key server.key -out server.crt -days 3650

3.编译和启动web服务器

cd 3rdparty/httpx-static
make
./objs/httpx-static -http 80 -https 443 -ssk server.key -ssc server.crt \
-proxy http://127.0.0.1:1989/sig -proxy http://127.0.0.1:1985/rtc \
-proxy http://127.0.0.1:8080/

5. 进入测试页面

  1. 打开demo地址:
https://localhost/demos/
https://192.xxx.3.6/demos/  #公网ip

2.输入Room和Display就可以进行1对1通话。

3. SRS4.0 WebRTC1对1通话逻辑分析

按f12打开一对一通话http页面源码,在 one2one.html?autostart=true&room=fbe219e 中可以看到,“开始通话”按钮id是btn_start,当点击按钮后,执行startDemo函数。

startDemo函数如下:

        var startDemo = async function () {
            var host = $('#txt_host').val(); //获取ip或者域名,房间id,参与者名字
            var room = $('#txt_room').val();
            var display = $('#txt_display').val();

            // Connect to signaling first. //关闭先前的websock连接
            if (sig) {
                sig.close(); //见srs.sig.js close部分
            }
            sig = new SrsRtcSignalingAsync(); //创建SrsRtcSignalingAsync,RTC信令
            sig.onmessage = function (msg) { //onmessage订阅新的信令消息
                console.log('Notify: ', msg);

                if (msg.event === 'leave') {
                    $('#player').hide();
                }

                if (msg.event === 'publish') { //房间已经存在的参与者,收到publish信令后再去订阅新加入者
                    if (msg.peer && msg.peer.publishing && msg.peer.display !== display) {
                        startPlay(host, room, msg.peer.display);
                    }
                }

                if (msg.event === 'control') {
                    if (msg.param === 'refresh') {
                        setTimeout(function () {
                            window.location.reload();
                        }, 500);
                    } else if (msg.param === 'alert') {
                        alert('From ' + msg.peer.display + ': ' + msg.data);
                    }
                }

                if (msg.participants.length >= 2) {
                    $('.srs_merge').show();
                } else {
                    $('.srs_merge').hide();
                }
            };
            await sig.connect(conf.wsSchema, conf.wsHost, room, display); //连接websock,见下面SrsRtcSignalingAsync代码

            control_refresh_peer = async function () {
                let r1 = await sig.send({action:'control', room:room, display:display, call:'refresh'});
                console.log('Signaling: control peer to refresh ok', r1);
            };
            control_alert_peer = async function () {
                let r1 = await sig.send({action:'control', room:room, display:display, call:'alert', data:$('#txt_alert').val()});
                console.log('Signaling: control peer to alert ok', r1);
            };

            let r0 = await sig.send({action:'join', room:room, display:display}); //向信令服务器发送join信令,会返回房间列表,包括当前房间id,房间人数和每个display的名字和是否推流,见下图。
            console.log('Signaling: join ok', r0);

            // For one to one demo, alert and ignore when room is full. 判断房间人数是否超过2个,因为是1v1场景
            if (r0.participants.length > 2) {
                alert('Room is full, already ' + (r0.participants.length - 1) + ' participants');
                sig.close();
                return;
            }

            // Start publish media if signaling is ok.
            await startPublish(host, room, display); //向srs流媒体服务器开始推流,代码见下面
            let r1 = await sig.send({action:'publish', room:room, display:display}); //向信令服务器发送publish信令
            console.log('Signaling: publish ok', r1);

            // Play the stream already in room. 对于新建的房间,会拉取房间内另一个人的流
            r0.participants.forEach(function(participant) {
                if (participant.display === display || !participant.publishing) return;
                startPlay(host, room, participant.display); //向srs流媒体拉房间内另一个人的流
            });

            if (r0.participants.length >= 2) {
                $('.srs_merge').show();
            }
        };

2.SrsRtcSignalingAsync代码:

// Async-await-promise based SRS RTC Signaling.
function SrsRtcSignalingAsync() {
    var self = {};

    // The schema is ws or wss, host is ip or ip:port, display is nickname
    // of user to join the room.
    self.connect = async function (schema, host, room, display) {
        var url = schema + '://' + host + '/sig/v1/rtc'; //如:wss://8.xxx.75.248/sig/v1/rtc
        self.ws = new WebSocket(url + '?room=' + room + '&display=' + display); //建立websock连接,地址为:wss://8.xxx.75.248/sig/v1/rtc?room=123&display=zhangsan

        self.ws.onmessage = function(event) {
            var r = JSON.parse(event.data);
            var promise = self._internals.msgs[r.tid];
            if (promise) {
                promise.resolve(r.msg);
                delete self._internals.msgs[r.tid];
            } else {
                self.onmessage(r.msg);
            }
        };

        return new Promise(function (resolve, reject) {
            self.ws.onopen = function (event) {
                resolve(event);
            };

            self.ws.onerror = function (event) {
                reject(event);
            };
        });
    };

    // The message is a json object.
    self.send = async function (message) {
        return new Promise(function (resolve, reject) {
            var r = {tid: Number(parseInt(new Date().getTime()*Math.random()*100)).toString(16).substr(0, 7), msg: message};
            self._internals.msgs[r.tid] = {resolve: resolve, reject: reject};
            self.ws.send(JSON.stringify(r));
        });
    };

    self.close = function () {
        self.ws && self.ws.close();
        self.ws = null;

        for (const tid in self._internals.msgs) {
            var promise = self._internals.msgs[tid];
            promise.reject('close');
        }
    };

    // The callback when got messages from signaling server.
    self.onmessage = function (msg) {
    };

    self._internals = {
        // Key is tid, value is object {resolve, reject, response}.
        msgs: {}
    };

    return self;
}

3.join信息返回信息。

4.startPublish和startPlay代码。

var startPublish = function (host, room, display) {
            $(".ff_first").each(function(i,e) {
                $(e).text(display);
            });

            var url = 'webrtc://' + host + '/' + room + '/' + display + conf.query; //如: webrtc://8.xxx.75.248/123/wangwu
            $('#rtc_media_publisher').show();
            $('#publisher').show();

            if (publisher) {
                publisher.close();
            }
            publisher = new SrsRtcPublisherAsync(); //创建RTC异步推流
            $('#rtc_media_publisher').prop('srcObject', publisher.stream);

            return publisher.publish(url).then(function(session){
                $('#self').text('Self: ' + url);
            }).catch(function (reason) {
                publisher.close();
                $('#rtc_media_publisher').hide();
                console.error(reason);
            });
        };

        var startPlay = function (host, room, display) {
            $(".ff_second").each(function(i,e) {
                $(e).text(display);
            });

            var url = 'webrtc://' + host + '/' + room + '/' + display + conf.query; //
            $('#rtc_media_player').show();
            $('#player').show();

            if (player) {
                player.close();
            }

            player = new SrsRtcPlayerAsync();
            $('#rtc_media_player').prop('srcObject', player.stream);

            player.play(url).then(function(session){
                $('#peer').text('Peer: ' + display);
                $('#rtc_media_player').prop('muted', false);
            }).catch(function (reason) {
                player.close();
                $('#rtc_media_player').hide();
                console.error(reason);
            });
        };

标签:function,room,self,SRS4.0,display,SRS,sig,msg,WebRTC
From: https://www.cnblogs.com/kn-zheng/p/17063639.html

相关文章

  • WebRTC - STUN/TURN服务器的搭建(使用coturn)
    在进行WebRTC通信时,节点间会按照如下顺序获取对方的地址:1)如果双端在同一个内网,直接用内网IP通信;2)通过STUN服务器,为双端构造可以直接访问的地址,打造一条可以穿透NAT的通路......
  • srs-bench 命令参数详解
    srs-bench项目源码,请在github上搜索安装过程省略安装完成后,进入srs-bench目录,执行srs_bench-h选项:-sfu目标SFU,srs或gb28181或janus。默认值:srs-nn要模......
  • 【转载】SRS、EasyDarwin、ZLMediaKit、Monibuca对比分析
    声明转自liuzhen007的《SRS、EasyDarwin、ZLMediaKit、Monibuca对比分析》作者:liuzhen007链接:https://juejin.cn/post/6926739029496954888来源:稀土掘金著作权归作......
  • 【SRS】http回调配置
    SRS作为一个高效的实时视频服务器,行业内很出名。目前我这里通过推流rtmp到SRS,然后在Web端请求视频进行播放。官网介绍地址:Introduction|SRS(ossrs.net)添加回调配置......
  • 使用SRS和JSWebrtc实现实时播放视频
    使用SRS搭建视频服务器参见官方地址:https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started-buildhttps://github.com/ossrs/srs修改srs.conf文件将rtc节点下的rt......
  • Webrtc audio
    整体理解在WebRTC中,Call是peerconnection的。为WebRTCCall注入的AudioState来自于全局的MediaEngine的VoiceEngine。AudioState是全局的,而Call则是con......
  • WebRTC 的音频弱网对抗之 NACK
    基础知识音频的NACK机制在WebRTC中默认是关闭的.rtcpfeedbacknack开启就可以了WebRTC的音频数据传输中,尽管对低延时有着很高的要求,但也实现了NACK,以用于一些音......
  • SRS视频服务器CallBack的Demo
    1.安装环境(很麻烦,可以选择编译启动)官方文档快速开始docker配置:dockerrun--rm-it-p1935:1935-p1985:1985-p8080:8080-d\registry.cn-hangzhou.aliyuncs......
  • SRS视频流服务器初试
    目录1.关于协议理解2.快速开始1.SRS安装2.推流3.拉流注:1)方式一:SRS网页播放器(推荐)2)方式二:VLC播放器(需要下载,延迟高,不推荐)1.关于协议理解在前面的博客中,我简单的介绍了关于......
  • win10 hyper-v 安装 基于Janus的webRTC环境
    一、安装webRTC环境的准备工作1.centos下载位置:​​https://mirrors.openanolis.cn/anolis/8.4/isos/GA/x86_64/​​ 2.win10没有hyper 解决办法:​​【转】windows没......