首页 > 其他分享 >srs+webrtc实现浏览器直播(仿b站页面,纯前端)

srs+webrtc实现浏览器直播(仿b站页面,纯前端)

时间:2024-04-09 16:35:38浏览次数:25  
标签:浏览器 pc button disabled srs video data webrtc refs

关于srs请看我之前的博客,SRS实现网页和手机端简单直播

与之不同的是,浏览器推流需要使用werbrtc,因此只需要按srs官网配置即可,WebRTC | SRS (ossrs.net)。回到正题...


 一.页面搭建

b站web直播页面是通过video标签元素实现,但是video并不能同时将摄像头、麦克风、屏幕共享等同时呈现出来,所以猜测是用的canvas,将不同素材通过画布呈现,同时把canvas的流放到video上。

1.我们要实现这个画布,首先需要使用webrtc(没有接触过的去看官网WebRTC API),在webrtc中,MediaDevices接口提供访问连接媒体输入的设备,如照相机和麦克风,以及屏幕共享等。它可以使你取得任何硬件资源的媒体数据。

enumerateDevices() 请求一个可用的媒体输入和输出设备的列表。

getDisplayMedia() 方法提供授权捕获展示的内容或部分内容(如一个窗口)。

getUserMedia() 会提示用户使用媒体输入的许可,媒体输入会产生一个MediaStream,里面包含了请求的媒体类型的轨道。此流可以包含一个视频轨道、一个音频轨道,也可能是其他轨道类型。

2.使用canvas标签,npm下载Fabric.js,Fabric.js 简化了很多 Canvas 里的概念,Fabric.js 语法更加简单易用,而且还提供了很多交互类的 api,更重要的是fabric.js操作canvas自带拖拽拉伸旋转效果。

首先通过fabric.canvas生成一个画布,但由于屏幕共享和摄像头都是视频类,所以可以通过document.createElement('video')创建video元素,并将获取到的MediaStream赋给video.srcObject,之后通过fabric.Image(video),将video中每一帧画面生成,同时还可以设置生成好的画面的宽高以及在哪个位置出现。(其他属性请到Fabric.js官网查看)之后通过fabric.canvas.add即可添加到画布中观看。

var canvasDom = new fabric.Image(videoEl, {
   top: 0,
   left: 0,
    width,
    height, 
    objectCaching: false
});

以此类推,实现以下素材的添加,同时在画布中显示(示例图片中包含摄像头、窗口、图片)

3.生成好画面后,需要将这添加的素材保存起来,并且可以删改。关于这个问题,可以新建数据类型tracks:[],存放素材数据。如下(要根据实际情况更改):

const mediaVideoTrack = {
       id: id,
       audio: 1,//是否开启音频流
       video: 1,//是否开启视频流
       mediaName: that.mediaName,//素材名称
       type: 'Media',//素材类型(有media、text等)
       track: undefined,//轨道
       trackid: undefined,//轨道id
       stream: undefined,//媒体流
       streamid: undefined,//媒体流id
       canvasDom:canvasDom,//fabric.Image元素
       videoEl:videoEl,//video元素
       volume:80,//音量
       hidden: false,//是否隐藏
       muted: false,//是否静音播放
        scaleInfo: {},//缩放比例
  };

实现如下,可以隐藏或呈现某个素材,修改仅限修改名称,不可修改内容,删除需要把fabric.canvas中与tracks中相同的删除。


 二.推流和拉流功能

推拉流功能是使用WebRTC+SRS实现的,webrtc和srs具体原理不在这里赘述,详情请查百度。

由于SRS中自带简单的信令服务器,所以在使用WebRTC中的RTCPeerConnection时只需交换sdp,设置setLocalDescription和setRemoteDescription,之后按照srs提供的api进行sdp交换来实现媒体流的推送。

代码示例(该代码借鉴csdn某大佬(忘记是哪个了

标签:浏览器,pc,button,disabled,srs,video,data,webrtc,refs
From: https://www.cnblogs.com/yuxuan-light-of-Taihu-Lake/p/18120875

相关文章

  • 获取浏览器地址栏参数
    1234function getURLParameter(name){return decodeURIComponent((new RegExp('[?|&]' +name+ '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;......
  • Firefox火狐浏览器控制台,提示:已拦截跨源请求:同源策略禁止读取位于 http://127.0.0.1
    前言全局说明Firefox火狐浏览器控制台,提示:已拦截跨源请求一、火狐官方说明https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS/Errors/CORSMissingAllowOrigin?utm_source=devtools&utm_medium=firefox-cors-errors&utm_campaign=default二、修改浏览器方法[原文......
  • antv下拉框展开选项到刚好到浏览器底部触发闪烁,会回弹一下
    关闭下拉框的动画样式.ant-select-dropdown.slide-up-appear.slide-up-appear-active.ant-select-dropdown-placement-bottomLeft,.ant-select-dropdown.slide-up-enter.slide-up-enter-active.ant-select-dropdown-placement-bottomLeft{ -webkit-animation-name:unset;......
  • webrtc分支切换到m94 下载报错 FileNotFoundError: [Errno 2] No such file or direct
    FileNotFoundError:[Errno2]Nosuchfileordirectory:'vpython' 此问题翻遍整个网络,没有解决方案,希望能帮忙到需要的人 描述:      正常下载代码后,基于master(默认)编译通过,现需要切到m94分支(参考 Linux/Ubuntu编译WebRTC&libmediasoupclient_linuxg++......
  • 小技巧:将waf部署到用户的浏览器
    首先推荐一个开源WAF:https://github.com/corazawaf/coraza该产品改造了coreruleset为coraza-coreruleset以保证适配性:https://github.com/corazawaf/coraza-coreruleset在研究过程中我发现他有个在线网址提供给大家测试WAF防护策略:https://playground.coraza.io/也是工作习......
  • 【顶部距离计算】计算元素顶部与浏览器顶部的距离
    在开发中,我们常常需要计算某个元素顶部与浏览器视口顶部的距离,只需要一个方法即可计算解决:使用getBoundingClientRect()方法代码示例:接收一个参数element表示需要计算的元素//计算该元素的顶部距离浏览器的顶部距离constgetElementTop=element=>{constrect......
  • 面试常问问题——浏览器访问网址发生了什么?
    总体来说分为以下几个过程:DNS解析TCP连接发送HTTP请求服务器处理请求并返回HTTP报文浏览器解析渲染页面连接结束 1.域名解析2.发起TCP的3次握手3.建立TCP连接后,发起http请求4.服务器响应http请求,浏览器得到html代码5、浏览器解析html代码,并请求html代码中的资源(......
  • Chrome浏览器前端开发调试时强制更新js、css静态资源文件缓存的方法
    以Chrome浏览器为例,国产浏览器未做全面测试。前端开发静态文件时,浏览器访问会缓存样式、图片、js等,怎么快速更新缓存。以下方法特别适合只想清除某个网页的缓存,而不想清除全部浏览器缓存可以采用以下方法。一、强制刷新同时按住ctrl+f5或ctrl+shift+r进行访问页面强制刷新,一般......
  • <datalist>大多数浏览器不支持,用html.css 自己实现<datalist>功能
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>CustomDropdown</title><styl......
  • Window下SRS流媒体服务器的搭建+RTMP视频推流
     一、前期准备SRS流媒体服务器无法直接在Windows上运行,依赖于Linux内核环境,一般需要下载虚拟机。本文采用Docker作为容器,打开win自带的Hyper-V虚拟机。在安装docker之前先要打开window的虚拟机。 1.1 开启Hyper-V(1)“控制面板”——“程序”—......