mediasoup学习与实践

news2024/9/21 20:39:10

一、mediasoup基本概念:

基础架构


1、worker
2、router
3、producer
4、consumer
5、transport

整体结构

特性

1、支持IPv6
2、ICE/DRLS/RTP/RTCP over UDP and TCP
3、支持simulcast和svc
4、支持拥塞控制
5、带宽控制
6、支持:STCP
7、多流使用同一个ICE+DTLS传输通道
8、性能高

二、mediasoup库JS部分

├── AudioLevelObserver.js #音频音量
├── Channel.js            #用于和c++部分信令通信
├── Consumer.js								#消费媒体数据
├── DataConsumer.js       
├── DataProducer.js
├── DirectTransport.js
├── EnhancedEventEmitter.js  #事件处理
├── Logger.js#日志
├── PayloadChannel.js
├── PipeTransport.js#router之间数据转发
├── PlainTransport.js#普通传输通道
├── Producer.js#生产媒体数据
├── Router.js#代表一个房间(路由)
├── RtpObserver.js#rtp的观察者
├── RtpParameters.js
├── SctpParameters.js
├── SrtpParameters.js
├── Transport.js#传输通道基类
├── WebRtcTransport.js#webrtc的传输通道
├── Worker.js#c++工作进程,节点
├── errors.js#错误信息
├── index.js#库索引
├── ortc.js
├── scalabilityModes.js
├── supportedRtpCapabilities.js#支持的RTP能力
├── types.js
└── utils.js #工具函数

medisoup的JS的作用

1、起到管理作用
2、生产json传给C++层
例子:

讨论mediasoup是否支持ffmpeg推流

先祭出mediasoup的架构图,可看ffmpeg/gstreamer可作为推流或接受流的工具,媒体流被推至mediasoup后可由router分发到其他客户端。
由于mediasoup是SFU模型的流媒体服务器,实际上它很适合做媒体数据转发工作。

先撸mediasoup官方提供的ffmpeg.sh

脚本中自带说明:

关闭https校验,不然443端口会校验。
ffmpeg.sh 中修改HTTPIE_COMMAND="http --verify=no --check-status"

执行脚本
SERVER_URL=https://192.168.1.110:4443 ROOM_ID=akkb2kdu MEDIA_FILE=./../app/resources/videos/video-audio-stereo.mp4 ./ffmpeg.sh

flutter run -d web-server

MediaSoup通信流程
MediaSoup通信流程 | ProcessOn免费在线作图,在线流程图,在线思维导图 |

ffmpng vlc 推流 ——》webrtc播放

vlc是可以同时播放多路流媒体的,我是同时播放了视频264音频g711rtp流

想只用rtp播放音视频流是没法做到同步的,必须结合rtcp

播放多路流媒体的时候只要把sdp文件结合一下就OK了

我是用dm365发送音视频流,pc vlc接收,程序中添加的rtp头,没使用jrtplib
————————————————
版权声明:本文为CSDN博主「zhangjikuan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:RTP发送音视频流vlc播放_zhangjikuan的博客-CSDN博客

1、构成

app应用:提供客户端所需要的应用代码

broadcasters:用于广播使用,用于推流的模块。单向传输,只有去或者只有回

server端:信令服务和媒体流服务,两者通过管道通信。细分为下面几部分:

--->config.js:配置文件/js文件,通过js获取一些基本信息。将配置信息交给servere.js使用

--->server.js:从config.js中去获取基本信息,获取信息之后去启动基本服务,比如wensocket服务、信令服务

--->lib:server.js使用的库文件,细分为以下几部分

------->Room.js:所有的真正的信令处理逻辑都是在这里实现,还描述了房间相关信息

------->interactiveClient.js:运行时内部信息查询客户端,与客户端交互(debug使用)

------->interactiveServer.js:运行时内部信息查询服务端,与服务端交换(debug使用)

mediasoup C++:C++部分,用于处理流媒体传输,包括lib与worker两部分

--->lib:一些js文件组成,主要用于对mediasoup的管理工作

--->worker:C++核心代码
cert:证书及密钥

DEBUG=${DEBUG:='*mediasoup* *INFO* *WARN* *ERROR*'} INTERACTIVE=${INTERACTIVE:='true'} node server.js
process.env.DEBUG: *mediasoup* *INFO* *WARN* *ERROR*
config.js:{...}
  mediasoup-demo-server:INFO running 8 mediasoup Workers... +0ms
  mediasoup createWorker() +0ms
  mediasoup:Worker constructor() +0ms
      mediasoup:Worker spawning worker process: /Users/uianster/Nutstore Files/.symlinks/坚果云/learn/mediasoup-demo/server/node_modules/mediasoup/worker/out/Release/mediasoup-worker --logLevel=warn --logTag=info --logTag=ice --logTag=dtls --logTag=rtp --logTag=srtp --logTag=rtcp --logTag=rtx --logTag=bwe --logTag=score --logTag=simulcast --logTag=svc --logTag=sctp --rtcMinPort=40000 --rtcMaxPort=49999 +0ms
  mediasoup:Channel constructor() +0ms
  mediasoup:PayloadChannel constructor() +0ms

[opening Readline Command Console...]
type help to print available commands
cmd>   mediasoup:Worker worker process running [pid:1414] +28ms
  mediasoup createWorker() +29ms
  mediasoup:Worker constructor() +1ms
  mediasoup:Worker spawning worker process: /Users/uianster/Nutstore Files/.symlinks/坚果云/learn/mediasoup-demo/server/node_modules/mediasoup/worker/out/Release/mediasoup-worker --logLevel=warn --logTag=info --logTag=ice --logTag=dtls --logTag=rtp --logTag=srtp --logTag=rtcp --logTag=rtx --logTag=bwe --logTag=score --logTag=simulcast --logTag=svc --logTag=sctp --rtcMinPort=40000 --rtcMaxPort=49999 +0ms
  mediasoup:Channel constructor() +28ms
  mediasoup:PayloadChannel constructor() +28ms
  mediasoup:Worker worker process running [pid:1415] +7ms
  mediasoup createWorker() +7ms
  mediasoup:Worker constructor() +0ms
  mediasoup:Worker spawning worker process: /Users/uianster/Nutstore Files/.symlinks/坚果云/learn/mediasoup-demo/server/node_modules/mediasoup/worker/out/Release/mediasoup-worker --logLevel=warn --logTag=info --logTag=ice --logTag=dtls --logTag=rtp --logTag=srtp --logTag=rtcp --logTag=rtx --logTag=bwe --logTag=score --logTag=simulcast --logTag=svc --logTag=sctp --rtcMinPort=40000 --rtcMaxPort=49999 +0ms
  mediasoup:Channel constructor() +7ms
  mediasoup:PayloadChannel constructor() +7ms
  mediasoup:Worker worker process running [pid:1416] +7ms
  mediasoup createWorker() +7ms
  mediasoup:Worker constructor() +0ms
  mediasoup:Worker spawning worker process: /Users/uianster/Nutstore Files/.symlinks/坚果云/learn/mediasoup-demo/server/node_modules/mediasoup/worker/out/Release/mediasoup-worker --logLevel=warn --logTag=info --logTag=ice --logTag=dtls --logTag=rtp --logTag=srtp --logTag=rtcp --logTag=rtx --logTag=bwe --logTag=score --logTag=simulcast --logTag=svc --logTag=sctp --rtcMinPort=40000 --rtcMaxPort=49999 +0ms
  mediasoup:Channel constructor() +7ms
  mediasoup:PayloadChannel constructor() +7ms
  mediasoup:Worker worker process running [pid:1417] +7ms
  mediasoup createWorker() +7ms
  mediasoup:Worker constructor() +0ms

mediasoup-demo server端的启动过程

::run();
async function runMediasoupWorkers()

export async function createWorker(

const worker = new Worker(
{
logLevel,
logTags,
rtcMinPort,
rtcMaxPort,
dtlsCertificateFile,
dtlsPrivateKeyFile,
appData
});

spawn //使用指定的命令行参数创建新进程

如何使用wireshark抓包

export PATH_TO_LIBWEBRTC_SOURCES="/Users/uianster/learn/webrtc/webrtc_ios/src"

export PATH_TO_LIBWEBRTC_BINARY="/Users/uianster/learn/webrtc/webrtc_ios/src/out/mac/obj"

export PATH_TO_OPENSSL_HEADERS="/usr/local/openssl/include"

安装oenssl
Mac上安装OpenSSL - 知乎

需要指定一下oepngl的root路径,不然还是找不到

export OPENSSL_ROOT_DIR="/usr/local/openssl"

mediasoup流程图_wzw88486969的博客-CSDN博客_mediasoup流程

本地环境

设备:MacBook Air (M1, 2020)
系统:macOS Big Bur

克隆官方demo

nodejs版本:
$ git clone https://github.com.cnpmjs.org/versatica/mediasoup-demo.git
#先下载server所需要的nodejs依赖包,依赖都在package.json中指定,但是由于相互依赖其他包的原因,实际上下载到
#当前目录下node_modules中(比package.json中指定的的包不少)
$ cd mediasoup-demo
$ git checkout v3
$ cd server
#这里使用yarn来安装nojs所需要的包,使用npm install满的要死还各种问题
$ yarn install
#由于墙的关系mediasoup下的速度较慢,可以使用yarn指定git路径进行下载
#因此使用进行加速下载
github.com.cnpmjs.org替换github.com后可实现加速下载
#指定下载mediasoup
yarn add https://github.com.cnpmjs.org/versatica/mediasoup.git

#再跑一遍,避免有的依赖包没有加上
yarn install
#如下则依赖安装安好

yarn install v1.22.10
[1/4] 🔍  Resolving packages...
success Already up-to-date.
✨  Done in 0.15s.

sever运行步骤

  1. 修改配置文件
  2. 将config.simple.js 修改为config.js
  3. IP改为局域网本机器IP(别改漏了)
  4. 生成密钥----参考
    5.yarn start运行sever

app运行

到app中:yarn start

常见错误

yarn错误版本

ubuntu@VM-0-4-ubuntu:~/learn/mediasoup-demo/app$ yarn
00h00m00s 0/0: : ERROR: There are no scenarios; must have at least one.
javascript - Yarn ERROR: There are no scenarios; must have at least one - Stack Overflow

部分依赖被墙了

ubuntu@VM-0-4-ubuntu:~/learn/mediasoup-demo/app$ yarn
yarn install v1.22.5
info No lockfile found.
[1/4] Resolving packages...
error An unexpected error occurred: "https://github.com/versatica/mediasoup-client: read ECONNRESET".
info If you think this is a bug, please open a bug report with the information provided in "/home/ubuntu/learn/mediasoup-demo/app/yarn-error.log".
info Visit yarn install | Yarn for documentation about this command.
单独下载
yarn add https://github.com.cnpmjs.org/versatica/mediasoup-client

兼容性忽略

error supports-color@9.0.2: The engine "node" is incompatible with this module. Expected version ">=12". Got "10.19.0"
yarn config set ignore-engines true

mediasoup公网部署

/**
 * IMPORTANT (PLEASE READ THIS):
 *
 * This is not the "configuration file" of mediasoup. This is the configuration
 * file of the mediasoup-demo app. mediasoup itself is a server-side library, it
 * does not read any "configuration file". Instead it exposes an API. This demo
 * application just reads settings from this file (once copied to config.js) and
 * calls the mediasoup API with those settings when appropriate.
 */

const os = require('os');

module.exports =
{
    // Listening hostname (just for `gulp live` task).
    domain : process.env.DOMAIN || 'localhost',
    // Signaling settings (protoo WebSocket server and HTTP API server).
    https  :
    {
        listenIp   : '0.0.0.0', //设置为0
        // NOTE: Don't change listenPort (client app assumes 4443).
        listenPort : process.env.PROTOO_LISTEN_PORT || 4443,
        // NOTE: Set your own valid certificate files.
        tls        :
        {
            cert : process.env.HTTPS_CERT_FULLCHAIN || `${__dirname}/certs/1_cuican.tech_bundle.crt`,
            key  : process.env.HTTPS_CERT_PRIVKEY || `${__dirname}/certs/2_cuican.tech.key`
        }
    },
    // mediasoup settings.
    mediasoup :
    {
        // Number of mediasoup workers to launch.
        numWorkers     : Object.keys(os.cpus()).length,
        // mediasoup WorkerSettings.
        // See https://mediasoup.org/documentation/v3/mediasoup/api/#WorkerSettings
        workerSettings :
        {
            logLevel : 'warn',
            logTags  :
            [
                'info',
                'ice',
                'dtls',
                'rtp',
                'srtp',
                'rtcp',
                'rtx',
                'bwe',
                'score',
                'simulcast',
                'svc',
                'sctp'
            ],
            rtcMinPort : process.env.MEDIASOUP_MIN_PORT || 40000,
            rtcMaxPort : process.env.MEDIASOUP_MAX_PORT || 49999
        },
        // mediasoup Router options.
        // See https://mediasoup.org/documentation/v3/mediasoup/api/#RouterOptions
        routerOptions :
        {
            mediaCodecs :
            [
                {
                    kind      : 'audio',
                    mimeType  : 'audio/opus',
                    clockRate : 48000,
                    channels  : 2
                },
                {
                    kind       : 'video',
                    mimeType   : 'video/VP8',
                    clockRate  : 90000,
                    parameters :
                    {
                        'x-google-start-bitrate' : 1000
                    }
                },
                {
                    kind       : 'video',
                    mimeType   : 'video/VP9',
                    clockRate  : 90000,
                    parameters :
                    {
                        'profile-id'             : 2,
                        'x-google-start-bitrate' : 1000
                    }
                },
                {
                    kind       : 'video',
                    mimeType   : 'video/h264',
                    clockRate  : 90000,
                    parameters :
                    {
                        'packetization-mode'      : 1,
                        'profile-level-id'        : '4d0032',
                        'level-asymmetry-allowed' : 1,
                        'x-google-start-bitrate'  : 1000
                    }
                },
                {
                    kind       : 'video',
                    mimeType   : 'video/h264',
                    clockRate  : 90000,
                    parameters :
                    {
                        'packetization-mode'      : 1,
                        'profile-level-id'        : '42e01f',
                        'level-asymmetry-allowed' : 1,
                        'x-google-start-bitrate'  : 1000
                    }
                }
            ]
        },
        // mediasoup WebRtcTransport options for WebRTC endpoints (mediasoup-client,
        // libmediasoupclient).
        // See https://mediasoup.org/documentation/v3/mediasoup/api/#WebRtcTransportOptions
        webRtcTransportOptions :
        {
            listenIps :
            [
                {
                    ip          : process.env.MEDIASOUP_LISTEN_IP || '172.17.0.4',//内网
                    announcedIp : process.env.MEDIASOUP_ANNOUNCED_IP|| '121.5.142.187'//外网
                }
            ],
            initialAvailableOutgoingBitrate : 1000000,
            minimumAvailableOutgoingBitrate : 600000,
            maxSctpMessageSize              : 262144,
            // Additional options that are not part of WebRtcTransportOptions.
            maxIncomingBitrate              : 1500000
        },
        // mediasoup PlainTransport options for legacy RTP endpoints (FFmpeg,
        // GStreamer).
        // See https://mediasoup.org/documentation/v3/mediasoup/api/#PlainTransportOptions
        plainTransportOptions :
        {
            listenIp :
            {
                ip          : process.env.MEDIASOUP_LISTEN_IP || '1.2.3.4',
                announcedIp : process.env.MEDIASOUP_ANNOUNCED_IP
            },
            maxSctpMessageSize : 262144
        }
    }
};

服务器:腾讯云 1核2G

期间会出现问题,能百度到的就不是问题,没必要记录了。
最后app启动后会弹出页面,但是是内网的需要手动该成服务器公网ip

特别说明:最好使用chrome进行测试,但是第一次加载非常满需要耐心。

https://blog.csdn.net/frodocheng/article/details/107118826?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_link(MediaSoup MediaSoup-demo v3 版本部署测试)

https://blog.csdn.net/u014338577/article/details/109682735?utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-4.control

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安全可靠的SRT实时传输协议

Secure Reliable Transport(SRT)是安全、可靠、低延时的多媒体实时传输协议。SRT协议使用AES进行数据加密,运用FEC进行前向纠错,并且有流量控制、拥塞控制。类似于QUIC协议,SRT采用UDP代替TCP,在应用层提供发送确认机制、ARQ自动重…

ArcGIS基础:点要素分割线要素和提取线要素的交点

第一个实验:【点要素分割线要素】 看下原始数据:下图所示,2个红点和一条绿线,用2个点去分割这条线。 找到【数据管理工具】,在找到【要素】,再找到【在点处分割线】,如…

【云原生 | Kubernetes 实战】07、Pod 高级实战:Pod 生命周期、启动钩子、停止钩子

目录 一、Pod 生命周期 1.1 pod 生命周期的重要行为 二、初始化容器最佳实战 2.1 Init 容器 2.2 初始化容器使用案例 2.3 初始化容器生产应用 三、主容器 3.1 容器钩子 3.2 演示 postStart 和 preStop 用法 总结 一、Pod 生命周期 pod从开始创建到终止退出的时间…

51单片机自学报告--实验部分

微机接口技术-自主学习笔记 PPT链接:微机接口自学--51单片机自学汇报PPT_猫猫爱吃小鱼的博客-CSDN博客 效果演示gif: 四、Proteus仿真 仿真环境:电路仿真软件: Proteus HEX可执行文件编写软件: keil uVision4 keil uVision4新…

设计模式——模板方法

GOF-23 模式分类 从目的来看: • 创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实 现引来的冲击。 • 结构型(Structural)模式&a…

OpenCV 透视变换

OpenCV 透视变换1. 简介2. 仿射变换2.1. 平移2.2. 旋转2.3. 放缩2.4. 错切2.5. 仿射变换3. 透视变换1. 简介 汽车的360度全景影像,从拍照视角变成鸟瞰图 这种变换常常用到透视变换 在了解透视变换前,需要了解一下其他的变换,包括 平移&#…

小白必知必会的几个IP协议知识

小白必知必会的几个IP协议知识1.IP地址属于网络层协议2.路由控制3.数据链路的抽象化4.IP属于面向无连接型1.IP地址属于网络层协议 在计算机通信中,为了识别通信对端,必须要有一个类似于地址的识别码进行标识。 MAC地址是用来标识同一个链路中不同计算机…

【C++泛型学习笔记】函数模板

提到C的程序设计方法,最先想到的便是两种:面向过程和面向对象编程。但是当我们去阅读一些优秀的C库源码时(比如CGAL),就会直接被其的泛型编程劝退。泛型编程也是C程序设计方法中的一种,不同于上述两种设计方…

一文教你从Linux内核角度探秘JDK NIO文件读写本质(下)

接上文一文教你从Linux内核角度探秘JDK NIO文件读写本质(上) 10. JDK NIO 对普通文件的写入 FileChannel fileChannel new RandomAccessFile(new File("file-read-write.txt"), "rw").getChannel();ByteBuffer heapByteBuffer B…

LRU和FIFO页面置换算法模拟实战

Introduction 本文将介绍如何使用LRU和FIFO实现页面置换的模拟(Python实现),并使用缺页率进行算法的评价。 Requirement 先附上具体的要求: 【实验目的】 (1)了解内存分页管理策略 (2)掌握…

[附源码]JAVA毕业设计昆明市人民医院血库管理系统(系统+LW)

[附源码]JAVA毕业设计昆明市人民医院血库管理系统(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。…

SSM框架-SpringMVC(一)

目录 1 SpringMVC简介 1.1 什么是mvc 1.2 什么是SpringMVC 1.3 SpringMVC的特点 2 入门案例 2.1 开发环境 2.2 创建maven工程 2.3 配置web.xml 2.4 创建请求控制器 2.5 创建SpringMVC配置文件 2.6 测试HelloWorld 2.7 优化配置 3 RequestMapping注解 3.1 RequestM…

3. 递归

3.1 递归 假设你在祖母的阁楼中翻箱倒柜,发现了一个上锁的神秘手提箱。 祖母告诉你,钥匙很可能在下面这个盒子里。 这个盒子里有盒子,而盒子里的盒子又有盒子。钥匙就在某个盒子中。 为找到钥匙,你将使用什么算法? 第一种&…

c++ word 不依赖软件操作

1、Duck 可以提取word的内容与表格,新建工程直接复制源码就可以得到库 使用实例如下所示: using namespace duckx; duckx::Document doc("file.docx"); doc.open(); //获取当前word中所有的表格 for (auto p doc.tabl…

计算机毕业论文java毕业设计选题源代码基于SSM的会议室预约系统

💖💖更多项目资源,最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《SSM会议室预约系统》该项目主要解决了会议室预约日常工作中的一些问题,采用技术的技术是jsp springmvcspringmybatis cssjs等。 项目…

ARM 汇编写启动代码之设置栈和调用C语言

一、C语言运行时需要和栈的意义 “C语言运行时(runtime)”需要一定的条件,这些条件由汇编来提供。C语言运行时主要是需要栈。 C语言与栈的关系:C语言中的局部变量都是用栈来实现的。如果我们汇编部分没有给 C 部分预先设置合理合…

PAT甲级考试知识点总结和一些看法

0 引言 本人今年PAT甲级考了95分,平时力扣也有再刷(大概有360题),感觉PAT主要还是面向考研党的,里面的题目其实难度是小于力扣的,但这种难度的题目浙大去年考研机试居然有20%的0分我其实不是很理解。 PAT…

【计算机网络】计算机网络复习总结 ------ 物理层

计算机网络 内容管理物理层 physical layer相关概念术语信息数据 data信号 signal码元 code cell 【波特率B --- 信号v】比特率R ---- 数据v基带信号 baseband带通(频带)信号单工 simplex 半双工 全双工失真理想信道奈奎斯特定理 (理想&#…

[附源码]Python计算机毕业设计Django求职招聘网站

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

室内温度控制仿真(Simulink+PLC)

本篇博客将会和大家一起一步步解读Simulink自带的仿真模型(Thermal Model of a House),之后再讨论PLC控制系统控制室内环境温度的一些经验方法。温度控制的大部分控制方法都是采用PID控制,有关PLC的PID控制相关内容可以参看专栏的其它文章,链接如下: 博途PLC 1200/1500P…