首页 > 编程语言 >LIVE555再学习 -- testOnDemandRTSPServer 源码分析

LIVE555再学习 -- testOnDemandRTSPServer 源码分析

时间:2023-04-03 20:07:02浏览次数:45  
标签:LIVE555 MPEG rtspServer testOnDemandRTSPServer stream RTSP server 源码


一、简介

先看一下官网上的介绍:

testOnDemandRTSPServer creates a RTSP server that can stream, via RTP unicast, from various types of media file, on demand. (Supported media types include: MPEG-1 or 2 audio or video (elementary stream), including MP3 audio; MPEG-4 video (elementary stream); H.264 video (elementary stream); H.265 video (elementary stream); MPEG Program or Transport streams, including VOB files; DV video; AMR audio; WAV (PCM) audio.) The server can also stream from a Matroska or WebM file (by demultiplexing and streaming the tracks within the file). MPEG Transport Streams can also be streamed over raw UDP, if requested - e.g., by a set-top box.

  • This server application also demonstrates how to deliver - via RTSP - a MPEG Transport Stream that arrived at the server as a UDP (raw-UDP or RTP/UDP) multicast or unicast stream. In particular, it is set up, by default, to accept input from the "testMPEG2TransportStreamer" demo application.

翻译一下:

testOnDemandRTSPServer 创建一个 RTSP 服务器,可以根据需要通过 RTP 单播从各种类型的媒体文件流式传输。 (支持的媒体类型包括:MPEG-1或2音频或视频(基本流),包括MP3音频; MPEG-4视频(基本流); H.264视频(基本流); H.265视频(基本流) MPEG程序或传输流,包括VOB文件; DV视频; AMR音频; WAV(PCM)音频。)服务器还可以从 Matroska 或 WebM 文件流(通过解复用和流式传输文件中的轨道)。 如果需要,MPEG传输流也可以通过原始UDP流传输,例如通过机顶盒。
该服务器应用程序还演示了如何通过 RTSP 传送作为 UDP(原始UDP或RTP / UDP)组播或单播流到达服务器的MPEG传输流。 特别地,默认情况下,它设置为接受来自“testMPEG2TransportStreamer”演示应用程序的输入。

二、源码分析

参看:live555 testOnDemandRTSPServer例程解析

此例程是关于构建live555 RTSP服务器的,可以点播很多类型的文件,这里只讲解H264的,本例程是点播,用的单播unicast的形式


#include "liveMedia.hh"  
#include "BasicUsageEnvironment.hh"  
  
  
//创建交互环境,用来打印相关信息的  
UsageEnvironment* env;  
  
  
// To make the second and subsequent client for each stream reuse the same  
// input stream as the first client (rather than playing the file from the  
// start for each client), change the following "False" to "True":  
Boolean reuseFirstSource = False;  
  
  
// To stream *only* MPEG-1 or 2 video "I" frames  
// (e.g., to reduce network bandwidth),  
// change the following "False" to "True":  
Boolean iFramesOnly = False;  
  
  
//打印相关信息的函数  
static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms,  
  char const* streamName, char const* inputFileName); // fwd  
  
  
int main(int argc, char** argv) {  
  // Begin by setting up our usage environment:  
  // 1.创建任务调度器,createNew其实就是创建类的实例  
  TaskScheduler* scheduler = BasicTaskScheduler::createNew();  
// 2. 创建交互环境  
  env = BasicUsageEnvironment::createNew(*scheduler);  
  //以下为权限控制的代码,设置后没有权限的客户端无法进行连接  
  UserAuthenticationDatabase* authDB = NULL;  
#ifdef ACCESS_CONTROL  
  // To implement client access control to the RTSP server, do the following:  
  authDB = new UserAuthenticationDatabase;  
  authDB->addUserRecord("username1", "password1"); // replace these with real strings  
  // Repeat the above with each <username>, <password> that you wish to allow  
  // access to the server.  
#endif  
  
  
  // 3. Create the RTSP server:此时就一直处于监听模客户端的连接  
  RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554, authDB);  
  if (rtspServer == NULL) {  
    *env << "Failed to create RTSP server: " << env->getResultMsg() << "\n";  
    exit(1);  
  }  
  
  
  char const* descriptionString  
    = "Session streamed by \"testOnDemandRTSPServer\"";  
  
  
  // Set up each of the possible streams that can be served by the  
  // RTSP server.  Each such stream is implemented using a  
  // "ServerMediaSession" object, plus one or more  
  // "ServerMediaSubsession" objects for each audio/video substream.  
  
  
  // A H.264 video elementary stream:  
  {  
    char const* streamName = "H264unicast";//流名字,媒体名  
    char const* inputFileName = "test.264";//文件名,当客户端输入的流名字为h264ESVideoTest时,实际上打开的是test.264文件  
    // 4.创建媒体会话  
    //当客户点播时,要输入流名字streamName,告诉RTSP服务器点播的是哪个流。  
    //流名字和文件名的对应关系是通过增加子会话建立起来的(流名字streamName不是文件名inputFileName)。媒体会话对会话描述、会话持续时间、流名字等与会话有关的信息进行管理  
    //第二个参数:媒体名、三:媒体信息、四:媒体描述  
    ServerMediaSession* sms  
      = ServerMediaSession::createNew(*env, streamName, streamName,  
     descriptionString);  
    //5.添加264子会话 这里的文件名才是真正打开文件的名字  
    //reuseFirstSource:  
    //这里的H264VideoFileS...类派生自FileServerMediaSubsession派生自OnDemandServerMediaSubsession  
    //而OnDemandServerMediaSubsession和PassiveMediaSubsession共同派生自ServerMediaSubsession  
    //关于读取文件之类都在这个类中实现的,如果要将点播改为直播就是要新建类继承此类然后添加新的方法  
    sms->addSubsession(H264VideoFileServerMediaSubsession  
      ::createNew(*env, inputFileName, reuseFirstSource));  
     //6.为rtspserver添加session  
    rtspServer->addServerMediaSession(sms);  
     //打印信息到标准输出  
    announceStream(rtspServer, sms, streamName, inputFileName);  
  }  
  
  
  // Also, attempt to create a HTTP server for RTSP-over-HTTP tunneling.  
  // Try first with the default HTTP port (80), and then with the alternative HTTP  
  // port numbers (8000 and 8080).  
  
  
  if (rtspServer->setUpTunnelingOverHTTP(80) || rtspServer->setUpTunnelingOverHTTP(8000) || rtspServer->setUpTunnelingOverHTTP(8080)) {  
    *env << "\n(We use port " << rtspServer->httpServerPortNum() << " for optional RTSP-over-HTTP tunneling.)\n";  
  } else {  
    *env << "\n(RTSP-over-HTTP tunneling is not available.)\n";  
  }  
  //执行循环方法,来执行循环方法,对套接字的读取事件和对媒体文件的延时发送操作都在这个循环中完成。  
  env->taskScheduler().doEventLoop(); // does not return  
  
  
  return 0; // only to prevent compiler warning  
}  
  
  
static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms,  
  char const* streamName, char const* inputFileName) {  
  char* url = rtspServer->rtspURL(sms);  
  UsageEnvironment& env = rtspServer->envir();  
  env << "\n\"" << streamName << "\" stream, from the file \""  
      << inputFileName << "\"\n";  
  env << "Play this stream using the URL \"" << url << "\"\n";  
  delete[] url;  
}

上面的源码分析很清楚了,和官方源码对比一下一目了然。

然后你可以跟 LIVE555再学习 -- testH264VideoStreamer 源码分析

玛德 豁然开朗,单播原来也就是这么回事。

想了解更多,参看:Live555学习之(二)------- testOnDemandRTSPServer

这部分看来有点必要后面再认真的讲一下吧

其中的 doEventLoop 函数有点意思 详解参看:LIVE555再学习 -- live555实现RTSP直播服务器 分析

三、测试


在 testProgs 目录下放入 test.264,执行 ./testOnDemandRTSPServer 

LIVE555再学习 -- testOnDemandRTSPServer 源码分析_UDP

可以看到有提示嘛,在 VLC 上输入URL rtsp://192.168.2.xx:8554/h264ESVideoTest

LIVE555再学习 -- testOnDemandRTSPServer 源码分析_ide_02

OK,有视频显示。此时,我还没看单播和多播区别,也没看testOnDemandRTSPServer的源码,不过好奇怪为什么

上面测试,现在了解到 testOnDemandRTSPServer 是单播,传输现有的 test.264 有是点播。


标签:LIVE555,MPEG,rtspServer,testOnDemandRTSPServer,stream,RTSP,server,源码
From: https://blog.51cto.com/u_15979522/6167161

相关文章

  • LIVE555再学习 -- 单播、多播、广播、直播、点播 都是个啥?
    上一篇文章提到单播、多播。但是这是什么意思?接下来我们看一下。参看:搜狗--单播参看:维基百科——单播一、单播简介    Unicast,是客户端与服务器之间的点到点连接。“点到点”指每个客户端都从服务器接收远程流。仅当客户端发出请求时,才发送单播流。Unicast(单播):在客......
  • LIVE555再学习 -- testRTSPClient 实例
    上一篇文章简单看了一遍 testRTSPClient 的源码,接下来举几个应用实例加深一下。首先什么都不做修改,先执行一遍,看一下。一、执行 testRTSPClient 特么,上面的东西我没看明白。。。a=、b=、c=等等这是什么?还有我看别人分析的好像用到什么网络抓包工具,我不知道是什么工具,可能是......
  • LIVE555再学习 -- testH264VideoStreamer 源码分析
    上一篇文章我们已经讲了一部分:testH264VideoStreamer重复从H.264基本流视频文件(名为“test.264”)中读取,并使用RTP多播进行流式传输。 该程序还具有内置的RTSP服务器。Apple的“QuickTime播放器”可用于接收和播放此音频流。要使用它,让玩家打开会话的“rtsp://”URL(程序在......
  • LIVE555再学习 -- testRTSPClient 源码分析
    现在开讲 testRTSPClient。在官网这这样一段介绍,参看:RTSPclient翻译下来就是:testRTSPClient是一个命令行程序,显示如何打开和接收由RTSPURL指定的媒体流,即以rtsp://开头的URL在这个演示应用中,接收到的音频/视频数据什么也没有。但是,您可以在自己的应用程序中使用和调整此代码(......
  • LIVE555再学习 -- Windows 下编译
    然后开始下载编译,其中包含,Windows、Linux和交叉编译三种形式。首先来讲Windows下编译参看:Live555研究之一源代码编译一、下载源码下载:Indexof/liveMedia/public参看:LIVE555StreamingMedia选择下载live555-latest.tar.gz二、文件介绍我的开发环境为win1064位+VS2017将上面......
  • centos8 源码安装编译 swoole4.6.7
      下载安装包 https://pecl.php.net/package/swoole    解压安装包解压swoole安装包tarzxvfswoole-4.6.7.tgz-C/usr/local/src/进入swoole文件cd/usr/local/src/swoole-4.6.7#phpize编译生成configure/usr/local/php/bin/phpize##编译swoole并生成......
  • UWB定位系统源码,工厂人员轨迹定位系统源码
    UWB高精度定位系统源码,智慧工厂人员定位系统源码,基于Vue+Springboot前后端分离架构开发的一套UWB定位系统源码。有演示。随着经济的高速发展,现代制造业规模不断扩大,生产车间面积广阔,生产设备日益繁多,生产工人数量多且分散作业,难以进行有效管理和实施全方位风险管控。现代工厂安全......
  • flask 请求与响应,session使用与源码分析,闪现与请求扩展
    目录cbv分析总结模板请求与响应请求:全局的request响应:新手四件套session使用及源码分析cookie与sessionsession执行原理session源码分析闪现作用用法请求扩展cbv分析基于类的视图cbv写法fromflaskimportFlask,request#视图基类fromflask.viewsimportMethodViewa......
  • Rust如何引入源码作为依赖
    问题描述通常我们在rust项目中引入第三方依赖包时,会直接指定包的版本,这种方式指定后,Cargo在编译时会从crates.io这个源中下载这些依赖包。[package]name="foo"version="0.1.0"edition="2021"[dependencies]j4rs=0.15.3比如这里我们就在项目中引用了j4rs这个包,这......
  • spring源码各个版本中的两个字符串比较的变更,值得学习
    判断一个字符串是否空串:1、Spring旧版本使用equals,新版本使用isEmpty()方法;查找String的源码发现isEmpty的底层使用this.value.length==0进行判断。粗略分析:equals在进行比较时耗时约0.1秒,==无耗时。 ......