为何标明“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会话相关的部分,如下所示:
- #include "liveMedia.hh"
- #include "BasicUsageEnvironment.hh"
- UsageEnvironment* env;
- // True:后启动的客户端总是从当前第一个客户端已经播放到的位置开始播放
- // False:每个客户端都从头开始播放影视频文件
- Boolean reuseFirstSource = False;
- //该函数打印相关信息
- static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms,
- char const* streamName, char const* inputFileName);
- int main(int argc, char** argv)
- {
- //创建任务调度器并初始化使用环境
- TaskScheduler* scheduler = BasicTaskScheduler::createNew();
- env = BasicUsageEnvironment::createNew(*scheduler);
- UserAuthenticationDatabase* authDB = NULL;
- //创建RTSP服务器,开始监听模客户端的连接
- //注意这里的端口号不是默认的554端口,因此访问URL时,需指定该端口号
- RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554, authDB);
- if (rtspServer == NULL)
- {
- *env setUpTunnelingOverHTTP(8080))
- {
- *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
- #ifndef _H264LIVEFRAMEDSOURCE_HH
- #define _H264LIVEFRAMEDSOURCE_HH
- #include
- class H264LiveFramedSource : public ByteStreamFileSource
- {
- public:
- static H264LiveFramedSource* createNew(UsageEnvironment& env, unsigned preferredFrameSize = 0, unsigned playTimePerFrame = 0);
- protected:
- H264LiveFramedSource(UsageEnvironment& env, unsigned preferredFrameSize, unsigned playTimePerFrame);
- ~H264LiveFramedSource();
- private:
- //重定义虚函数
- virtual void doGetNextFrame();
- };
- #endif
- #include "h264LiveFramedSource.hh"
- #include "GroupsockHelper.hh"
- #include "spsdecode.h"
- int findStartCode(unsigned char *buf, int zeros_in_startcode)
- {
- int info;
- int i;
- info = 1;
- for (i = 0; i
关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册


微信扫码登录