本章将带你详细了解Mediasoup是如何设计的,它又是如何达到高可用,可扩展的,性能是如何优化的,本章你将不仅领略到高性能流媒体服务器的设计精髓, 知道好的架构设计是如何的优美,也会知道所有高性能服务器的实现都是每个细微处的不断打磨才造就出来的。…

15-1 mediasoup库的架构讲解

图片.png
Worker:节点,进程
Router:相当于房间,路由器
Producer:音频和视频的生产者,一个视频会议,参加的每个人都是音频和视频的生产者,音频一个Producer,视频一个Producer。
Consumer:和Producer对应。
Transport:传输Producer和Consumer

图片.png
Worker之间,可以通过PipeTransport来通信。

图片.png
图片.png
DataChannel使用STCP协议,可以传输文本。
图片.png

15-2 MediasoupJS的作用

下面是mediasoup-demo/server/node_modules/mediasoup/lib/ 下面的js文件介绍。
图片.png
AudioLevelObserver.js :检测声音大小
Channel.js 跟C++部分进行信令通信
Consumer.js 消费者,音频一个,视频也一个。
DataConsumer.js
DataProducer.js
DirectTransport.js
EnhancedEventEmitter.js: EventEmitter的一个封装,事件发射器
Logger.js :日志
PayloadChannel.js
PipeTransport.js : 每个进程Worker中连接Router之间的通信
PlainTransport.js : 主要用于普通的非加密的RTP数据的传输
Producer.js :视频或者音频的生产者
Router.js :对应每个房间或者路由器
RtpObserver.js :RTP观察者
RtpParameters.js
SctpParameters.js
SrtpParameters.js
Transport.js :一个基类,PipeTransport和PlainTransport这些都继承它实现。
WebRtcTransport.js :浏览器使用的传输
Worker.js :进程
errors.js :错误信息
index.js :Mediasoup的库,上层引入Mediasoup最先导入的库,也为库的索引
ortc.js :以对象的形式存储帧率码率等相关信息,和sdp对比。
scalabilityModes.js
supportedRtpCapabilities.js :支持rtp的能力
types.js
utils.js:配置

图片.png
可以看到,几乎所有的类都继承EnhancedEventEmitter

图片.png
图片.png
https://blog.csdn.net/Frederick_Fung/article/details/106919882

15-3 WebRTC中的C++类关系图

图片.png

图片.png
RembServer和RembClient用于带宽评估。
[

](https://blog.csdn.net/gjy_it/category_9483663.html)
https://blog.csdn.net/gjy_it/article/details/104474095

15-4 Mediasoup启动详解

server.js调用runMediasoupWorkers()函数中,每创建一个Worker
mediasoup.createWorker,都会调用mediasoup-demo/server/node_modules/worker/src/main.cpp里面去。

main.cpp

  1. #define MS_CLASS "mediasoup-worker"
  2. // #define MS_LOG_DEV_LEVEL 3
  3. #include "MediaSoupErrors.hpp"
  4. #include "lib.hpp"
  5. #include <cstdlib> // std::_Exit(), std::genenv()
  6. #include <string>
  7. static constexpr int ConsumerChannelFd{ 3 };
  8. static constexpr int ProducerChannelFd{ 4 };
  9. static constexpr int PayloadConsumerChannelFd{ 5 };
  10. static constexpr int PayloadProducerChannelFd{ 6 };
  11. int main(int argc, char* argv[])
  12. {
  13. // Ensure we are called by our Node library.
  14. if (!std::getenv("MEDIASOUP_VERSION"))
  15. {
  16. MS_ERROR_STD("you don't seem to be my real father!");
  17. std::_Exit(EXIT_FAILURE);
  18. }
  19. std::string version = std::getenv("MEDIASOUP_VERSION");
  20. //mediasoup\worker\src\lib.cpp
  21. auto statusCode = run_worker(
  22. argc,
  23. argv,
  24. version.c_str(),
  25. ConsumerChannelFd,
  26. ProducerChannelFd,
  27. PayloadConsumerChannelFd,
  28. PayloadProducerChannelFd);
  29. switch (statusCode)
  30. {
  31. case 0:
  32. std::_Exit(EXIT_SUCCESS);
  33. case 1:
  34. std::_Exit(EXIT_FAILURE);
  35. case 42:
  36. std::_Exit(42);
  37. }
  38. }

Worker进程所在目录。
mediasoup-demo/server/node_modules/mediasoup/worker/out/Release