linux live555编译以及rtsp服务器搭建
创始人
2025-01-07 11:06:14
0次

一、live555源码

下载:点击跳转

二、编译

1、往文件 config.linux里的 COMPILE_OPTS 添加以下两个参数 -DNO_STD_LIB 和 -DNO_OPENSSL=1 ,修改后如下:

COMPILE_OPTS =		$(INCLUDES) -I/usr/local/include -I.  -O2 -DNO_STD_LIB -DNO_OPENSSL=1 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 C =			c C_COMPILER =		cc C_FLAGS =		$(COMPILE_OPTS) $(CPPFLAGS) $(CFLAGS) CPP =			cpp CPLUSPLUS_COMPILER =	c++ CPLUSPLUS_FLAGS =	$(COMPILE_OPTS) -Wall -DBSD=1 $(CPPFLAGS) $(CXXFLAGS) OBJ =			o LINK =			c++ -o LINK_OPTS =		-L. $(LDFLAGS) CONSOLE_LINK_OPTS =	$(LINK_OPTS) LIBRARY_LINK =		ar cr  LIBRARY_LINK_OPTS =	 LIB_SUFFIX =			a LIBS_FOR_CONSOLE_APPLICATION = -lssl -lcrypto LIBS_FOR_GUI_APPLICATION = EXE = 

2、分别执行以下命令

./genMakefiles linux make clean make -j8 mkdir build make install PREFIX=$PWD/build   /*************************** 以下用于交叉编译的,若是交叉编译不用输入上面的命令 ****************************/ //创建脚本文件,并输入以下信息 #!/bin/bash  LIVE555_DIR=`pwd`  cd $LIVE555_DIR  INSTALL_DIR=$LIVE555_DIR/build mkdir -p $INSTALL_DIR  #编译成静态库 export LDFLAGS="-static"  #声明交叉编译器的路径 #export PATH=/opt/arm-gcc/bin/:$PATH  ./genMakefiles armlinux make -j$(nproc) CROSS_COMPILE=aarch64-linux-gnu-  make install PREFIX=$INSTALL_DIR CROSS_COMPILE=aarch64-linux-gnu-

三、搭建rtsp服务器

1、利用qt creator创建工程,在 *.pro 文件添加 live555 库和头文件的路径(注意库的顺序)

INCLUDEPATH *= /home/gui/live/build/include/liveMedia/ INCLUDEPATH *= /home/gui/live/build/include/BasicUsageEnvironment/ INCLUDEPATH *= /home/gui/live/build/include/groupsock INCLUDEPATH *= /home/gui/live/build/include/UsageEnvironment/  LIBS += -L/home/gui/live/build/lib/ -lliveMedia \          -lBasicUsageEnvironment -lgroupsock -lUsageEnvironment

2、服务器代码实现如下(参考源码的testOnDemandRTSPServer.cpp文件例程):

#include   #include "liveMedia.hh" #include "BasicUsageEnvironment.hh" #include "InputFile.hh" #include "BasicHashTable.hh" #include  #include   static void announceURL(RTSPServer* rtspServer, ServerMediaSession* sms) {   if (rtspServer == NULL || sms == NULL) return; // sanity check   UsageEnvironment& env = rtspServer->envir();   env << "Play this stream using the URL ";   if (weHaveAnIPv4Address(env)) {     char* url = rtspServer->ipv4rtspURL(sms);     env << "\"" << url << "\"";     delete[] url;     if (weHaveAnIPv6Address(env)) env << " or ";   }   if (weHaveAnIPv6Address(env)) {     char* url = rtspServer->ipv6rtspURL(sms);     env << "\"" << url << "\"";     delete[] url;   }   env << "\n"; }  static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms,                char const* streamName, char const* inputFileName) {   UsageEnvironment& env = rtspServer->envir();    env << "\n\"" << streamName << "\" stream, from the file \""       << inputFileName << "\"\n";   announceURL(rtspServer, sms); }    int main(int argc, char *argv[]) {     // Begin by setting up our usage environment:     TaskScheduler* scheduler = BasicTaskScheduler::createNew();     UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);     //设置RTP数据的最大传输大小     OutPacketBuffer::maxSize = 1000000;     //创建一个rtsp的服务     RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554);     if (rtspServer == NULL) {     *env << "Failed to create RTSP server: " << env->getResultMsg() << "\n";     exit(1);     }      char const* descriptionString     = "Session streamed by \"LiveRTSPServer\"";      Boolean reuseFirstSource = true;     // A H.264 video elementary stream:     {         char const* streamName = "h264ESVideoTest";         char const* inputFileName = "test.264";//hevc          //创建一个会话         ServerMediaSession* sms           = ServerMediaSession::createNew(*env, streamName, streamName,                           descriptionString);         //管理之前,需要先注册一个实例,实现里边所有的管理function,将来给rtsp服务调度。         sms->addSubsession(H264VideoFileServerMediaSubsession                    ::createNew(*env, inputFileName, reuseFirstSource));         rtspServer->addServerMediaSession(sms);         //将ServerMediaSession添加到rstp服务         announceStream(rtspServer, sms, streamName, inputFileName);      }      // A MPEG-1 or 2 audio+video program stream:       {         char const* streamName = "mpeg1or2AudioVideoTest";         char const* inputFileName = "test.mpg";         // NOTE: This *must* be a Program Stream; not an Elementary Stream         ServerMediaSession* sms           = ServerMediaSession::createNew(*env, streamName, streamName,                           descriptionString);         MPEG1or2FileServerDemux* demux           = MPEG1or2FileServerDemux::createNew(*env, inputFileName, reuseFirstSource);         sms->addSubsession(demux->newVideoServerMediaSubsession(false));         sms->addSubsession(demux->newAudioServerMediaSubsession());         rtspServer->addServerMediaSession(sms);          announceStream(rtspServer, sms, streamName, inputFileName);       }      //开始运行服务     env->taskScheduler().doEventLoop(); // does not return      return 0;  } 

通过ffplay播放,测试效果如下:

demo下载:点击跳转

创作不易,打赏一下呗。。

           

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...