您当前的位置: 首页 >  windows

phymat.nico

暂无认证

  • 0浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

通过live555实现H264 RTSP直播(Windows版)

phymat.nico 发布时间:2017-12-31 04:04:55 ,浏览量:0

为何标明“Windows版”,因为firehood大神已经实现了linux版:通过live555实现H264 RTSP直播

相关文章:

【1】Win7(Windows 7)下用VS2013(Visual Studio 2013)编译live555

【2】RTSP协议分析

【3】windows命名管道

一.基础

live555的学习基本上都是从E:\live555\testProgs中的testOnDemandRTSPServer.cpp示例开始的,这个例子实现了一个最简单的RTSP服务器。文件名中的“OnDemand”意思是:依指令行事,也就是说只有当客户端通过URL主动访问并发送相关指令时,该RTSP服务器才会将文件流化并推送到客户端。这个例子是基于RTP单播的,关于单播可以参考:Qt调用jrtplib实现单播、多播和广播

通过testOnDemandRTSPServer.cpp可以学习一个RTSP服务器的搭建步骤。这里新建一个名为h264LiveMediaServer的Win32控制台工程,新建并添加h264LiveMediaServer.cpp,然后将testOnDemandRTSPServer.cpp拷贝到h264LiveMediaServer.cpp,接着做少量修改,只保留与H.264会话相关的部分,如下所示:

[cpp] view plain copy
  1. #include "liveMedia.hh"  
  2. #include "BasicUsageEnvironment.hh"  
  3.   
  4. UsageEnvironment* env;  
  5.   
  6. // True:后启动的客户端总是从当前第一个客户端已经播放到的位置开始播放  
  7. // False:每个客户端都从头开始播放影视频文件  
  8. Boolean reuseFirstSource = False;  
  9.   
  10. //该函数打印相关信息  
  11. static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms,  
  12.     char const* streamName, char const* inputFileName);   
  13.   
  14. int main(int argc, char** argv)   
  15. {  
  16.     //创建任务调度器并初始化使用环境  
  17.     TaskScheduler* scheduler = BasicTaskScheduler::createNew();  
  18.     env = BasicUsageEnvironment::createNew(*scheduler);  
  19.   
  20.     UserAuthenticationDatabase* authDB = NULL;  
  21.   
  22.     //创建RTSP服务器,开始监听模客户端的连接  
  23.     //注意这里的端口号不是默认的554端口,因此访问URL时,需指定该端口号  
  24.     RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554, authDB);  
  25.     if (rtspServer == NULL)   
  26.     {  
  27.         *env setUpTunnelingOverHTTP(8080))   
  28.     {  
  29.         *env addSubsession(H264VideoFileServerMediaSubsession::createNew(*env, inputFileName,reuseFirstSource)),中的H264VideoFileServerMediaSubsession替换成自己的子会话。H264VideoFileServerMediaSubsession类在其createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate)函数中调用了ByteStreamFileSource::createNew(envir(), fFileName),而frame的获取正是在ByteStreamFileSource类中的doGetNextFrame()函数中实现的。因此,这里需要继承H264VideoFileServerMediaSubsession和ByteStreamFileSource类,并重写其中的createNewStreamSource和doGetNextFrame函数。

    代码如下所示:

    h264LiveFramedSource.hh

    [cpp] view plain copy
    1. #ifndef _H264LIVEFRAMEDSOURCE_HH  
    2. #define _H264LIVEFRAMEDSOURCE_HH  
    3.   
    4.   
    5. #include   
    6.   
    7.   
    8. class H264LiveFramedSource : public ByteStreamFileSource  
    9. {  
    10. public:  
    11.     static H264LiveFramedSource* createNew(UsageEnvironment& env, unsigned preferredFrameSize = 0, unsigned playTimePerFrame = 0);  
    12.   
    13.   
    14. protected:  
    15.     H264LiveFramedSource(UsageEnvironment& env, unsigned preferredFrameSize, unsigned playTimePerFrame);  
    16.     ~H264LiveFramedSource();  
    17.   
    18.   
    19. private:  
    20.     //重定义虚函数  
    21.     virtual void doGetNextFrame();  
    22. };  
    23.   
    24. #endif  
    h264LiveFramedSource.cpp
    [cpp] view plain copy
    1. #include "h264LiveFramedSource.hh"  
    2. #include "GroupsockHelper.hh"  
    3. #include "spsdecode.h"  
    4.   
    5. int findStartCode(unsigned char *buf, int zeros_in_startcode)  
    6. {  
    7.     int info;  
    8.     int i;  
    9.   
    10.     info = 1;  
    11.     for (i = 0; i 
关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0453s