live555 实现一个最简单的RTSP服务器
2016-01-14 09:00
603 查看
用live555中的库写了一个最简单的RTSPServer程序,仅用于学习目的。从下例的代码中,可以清析的明白RTSPServer的函数调用流程。
[cpp] view
plaincopyprint?
#include <BasicUsageEnvironment.hh>
#include "liveMedia.hh"
static ServerMediaSession* createNewSMS(UsageEnvironment& env, char const* fileName);
int main()
{
TaskScheduler* scheduler;
UsageEnvironment* env ;
RTSPServer* rtspServer;
ServerMediaSession* sms;
//创建任务调用器
scheduler = BasicTaskScheduler::createNew();
//创建交互环境
env = BasicUsageEnvironment::createNew(*scheduler);
//创建RTSP服务器
rtspServer = RTSPServer::createNew(*env,554); //使用554端口
if(rtspServer == NULL)
{
rtspServer = RTSPServer::createNew(*env,8554); //554端口被占用,就使用8554端口
}
//打印服务器地址
*env << "Play streams from this server using the URL\n\t"
<< rtspServer->rtspURLPrefix() << "<filename>.\n";
//创建session
sms = createNewSMS(*env, "test.mpg");
rtspServer->addServerMediaSession(sms);
//添加其它文件对应的session...
//进行事件循环
env->taskScheduler().doEventLoop(); // does not return
return 0;
}
static ServerMediaSession* createNewSMS(UsageEnvironment& env, char const* fileName)
{
char const* extension = strrchr(fileName, '.');
ServerMediaSession* sms = NULL;
Boolean reuseSource = False; //不重用source
sms = ServerMediaSession::createNew(env, fileName); //创建一个session
//
//在session中添加subssesion
//
if(strcmp(extension, ".aac") == 0)
{
sms->addSubsession(ADTSAudioFileServerMediaSubsession::createNew(env, fileName, reuseSource));
}
else if(strcmp(extension, ".264") == 0)
{
sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));
}
else if(strcmp(extension, ".mpg") == 0)
{
MPEG1or2FileServerDemux* demux
= MPEG1or2FileServerDemux::createNew(env, fileName, reuseSource);
sms->addSubsession(demux->newVideoServerMediaSubsession());
sms->addSubsession(demux->newAudioServerMediaSubsession());
}
//添加其它媒体格式支持...
return sms;
}
FROM: http://blog.163.com/zsy_19880518/blog/static/18525812720130811024799/
[cpp] view
plaincopyprint?
#include <BasicUsageEnvironment.hh>
#include "liveMedia.hh"
static ServerMediaSession* createNewSMS(UsageEnvironment& env, char const* fileName);
int main()
{
TaskScheduler* scheduler;
UsageEnvironment* env ;
RTSPServer* rtspServer;
ServerMediaSession* sms;
//创建任务调用器
scheduler = BasicTaskScheduler::createNew();
//创建交互环境
env = BasicUsageEnvironment::createNew(*scheduler);
//创建RTSP服务器
rtspServer = RTSPServer::createNew(*env,554); //使用554端口
if(rtspServer == NULL)
{
rtspServer = RTSPServer::createNew(*env,8554); //554端口被占用,就使用8554端口
}
//打印服务器地址
*env << "Play streams from this server using the URL\n\t"
<< rtspServer->rtspURLPrefix() << "<filename>.\n";
//创建session
sms = createNewSMS(*env, "test.mpg");
rtspServer->addServerMediaSession(sms);
//添加其它文件对应的session...
//进行事件循环
env->taskScheduler().doEventLoop(); // does not return
return 0;
}
static ServerMediaSession* createNewSMS(UsageEnvironment& env, char const* fileName)
{
char const* extension = strrchr(fileName, '.');
ServerMediaSession* sms = NULL;
Boolean reuseSource = False; //不重用source
sms = ServerMediaSession::createNew(env, fileName); //创建一个session
//
//在session中添加subssesion
//
if(strcmp(extension, ".aac") == 0)
{
sms->addSubsession(ADTSAudioFileServerMediaSubsession::createNew(env, fileName, reuseSource));
}
else if(strcmp(extension, ".264") == 0)
{
sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));
}
else if(strcmp(extension, ".mpg") == 0)
{
MPEG1or2FileServerDemux* demux
= MPEG1or2FileServerDemux::createNew(env, fileName, reuseSource);
sms->addSubsession(demux->newVideoServerMediaSubsession());
sms->addSubsession(demux->newAudioServerMediaSubsession());
}
//添加其它媒体格式支持...
return sms;
}
FROM: http://blog.163.com/zsy_19880518/blog/static/18525812720130811024799/
相关文章推荐
- Codeforces Round #290 (Div. 1) C. Fox And Dinner
- 基于javascript实现随机颜色变化效果
- IT人经济思维之创业 - 创业与投资系列文章
- django小技巧
- poj-3020-二分图最大匹配
- 本地ORACLE忘记SYS用户密码解决方法
- Hisi单独编译kernel
- 判断IP、MAC地址是否符合规范
- JavaScript事件类型中UI事件详解
- iOS中的UINavigationController导航栏视图控制器的简单应用
- 网页去重和网页反作弊
- 1901: Zju2112 Dynamic Rankings 树状数组套主席树
- 汇报措辞:你懂得如何向领导汇报吗(审阅、审批、审阅、批示、查阅)?
- svn: E155004 is already locked 解决方案
- listener.ora、sqlnet.ora、tnsnames.ora
- 绩效工资制度
- GNS3 模拟Arp命令1
- Android UI布局之用户界面概述
- 关于Busybox对interfaces文件的解析过程
- _hud用法