如何从OnDemandServerMediaSubsession类以及继承类对象中获取RTCP信息(句柄)

OnDemandServerMediaSubsession.cpp void StreamState::startPlaying函数中添加:

fRTCPInstance->setRRHandler(fMaster.fRRHandlerTask, fMaster.fRRHandlerClientData);

OnDemandServerMediaSubsession.hh 中OnDemandServerMediaSubsession添加两个成员:

 TaskFunc* fRRHandlerTask;
void* fRRHandlerClientData;

以及成员函数

setRTCPRRPacketHandler(TaskFunc* handler, void* clientData) {
fRRHandlerTask = handler;
fRRHandlerClientData = clientData;
}

创建CamServerMediaSubsession 对象时,设置回调。(CamServerMediaSubsession 是继承于 OnDemandServerMediaSubsession,重写createNewStreamSource和createNewRTPSink即可)

CamServerMediaSubsession   *sub = CamServerMediaSubsession::createNew(*env, inputDevice, &device);
...
sub->setRTCPRRPacketHandler(RTCPRRHandler, (void *)sub);
...

函调函数中获取RTCP RR信息

void RTCPRRHandler(void* clientData)
{
using namespace CamStream;
CamServerMediaSubsession *sub = (CamServerMediaSubsession *)clientData;
RTPSink *sink = sub->get_rtp_sink();
if (!sink) {
std::cout<<"unable to get sink obj, not ready"<<std::endl;
return;
}
bool ignore_firstRR = true; RTPTransmissionStatsDB& transmissionStats = sink->transmissionStatsDB();
RTPTransmissionStatsDB::Iterator iter(transmissionStats);
RTPTransmissionStats* substat; while ((substat = iter.next()) != NULL) {
auto cam = sub->get_cam_instance();
auto jitter = substat->jitter();
auto loss_ratio = ((float)substat->packetLossRatio()/)*; // %
auto rtt = (int)(((float)substat->roundTripDelay()/)*); //ms
auto last_bitrate = cam->get_bitrate(); std::cout<<"SSRC "<<substat->SSRC()
<<" RTT "<<rtt<<" ms"
<<" jitter "<<jitter
<<" loss "<<(int)loss_ratio<<"%"<<std::endl;
  }
}

最后,根据丢帧率以及RTTD等信息,我们可以调整视频源的码率,实现QoS。

关于CamServerMediaSubsession的实现(实现下面两个函数,就可以蒋H264视频流转为RTP传输流,从而实现RTSP服务器) 

  /*source */
  FramedSource* CamServerMediaSubsession::createNewStreamSource(unsigned clientSessionId, unsigned& estBitrate)
{
estBitrate = static_cast<unsigned int>(this->bit_rate_);
FramedSource *source = replicator_->createStreamReplica();
//H264VideoStreamDiscreteFramer的输入是离散的NALU
//H264VideoStreamFramer的输入是stream bit流
FramedSource *h264_source = H264VideoStreamDiscreteFramer::createNew(envir(), source);
return h264_source;
} /*sink */
RTPSink* CamServerMediaSubsession::createNewRTPSink(Groupsock* rtpGroupsock,
unsigned char rtpPayloadTypeIfDynamic,
FramedSource* inputSource)
{
auto sink = H264VideoRTPSink::createNew(envir(),
rtpGroupsock,
rtpPayloadTypeIfDynamic,
sps_nal_,
sps_nal_size_,
pps_nal_,
pps_nal_size_);
return sink;
}

总结,上面的实现修改了live555源码,官方推荐的方式是通过继承现有类重写方法来实现,不过代码看了半天没头绪,有知道怎么弄的告诉我声(vslinux@qq.com)

基于LIVE555的RTSP QoS实现的更多相关文章

  1. 基于Live555,ffmpeg的RTSP播放器直播与点播

    基于Live555,ffmpeg的RTSP播放器直播与点播 多路RTSP高清视频播放器下载地址:http://download.csdn.net/detail/u011352914/6604437多路 ...

  2. 基于live555的视频直播 DM368IPNC RTSP分析

    因需要,从个人的理解顺序和需求角度对live555的分析与开发整理,包含RTSP Server与RTSP Client.如何直播H.264流与JPEG流等,均进行了探讨,对live555的初学者有一定 ...

  3. EasyRTSPClient:基于live555封装的支持重连的RTSP客户端RTSPClient

    今天先简单介绍一下EasyRTSPClient,后面的文章我们再仔细介绍EasyRTSPClient内部的设计过程: EasyRTSPClient:https://github.com/EasyDar ...

  4. 【视频开发】RTSP SERVER(基于live555)详细设计

    /* *本文基于LIVE555的嵌入式的RTSP流媒体服务器一个设计文档,个中细节现剖于此,有需者可参考指正,同时也方便后期自己查阅.(本版本是基于2011年的live555) 作者:llf_17@q ...

  5. 基于Live555实现RtspServer及高清高分辨率和高码率视频传输优化

    基于Live555实现RtspServer及高清高码率视频传输优化 最近做了一些pc和嵌入式平台的RTSP服务器项目,大多数的要求是简单但是功能全面,并且性能还要强劲.综合考虑后,基本都是在基于liv ...

  6. 基于live555实现的RTSPServer对底层进行性能优化的方法

    在博客<EasyIPCamera高性能摄像机RTSP服务器RTSPServer解决方案>我介绍了基于live555实现的一套RTSPServer功能组件,当时开发者经过几个月的调试,已经将 ...

  7. 调用Live555接收RTSP直播流,转换为Http Live Streaming(iOS直播)协议

    Live555接收RTSP直播流,转换Http Live Streaming(iOS直播)协议 RTSP协议也是广泛使用的直播/点播流媒体协议,之前实现过一个通过live555接收RTSP协议,然后转 ...

  8. 基于live555开发嵌入式linux系统的rtsp直播服务

    最近要搞一个直播服务,车机本身是个前后双路的Dvr,前路1080P 25fps,后路720P 50fps,现在要连接手机app预览实时画面,且支持前后摄像头画面切换. 如果要做直播,这个分辨率和帧率是 ...

  9. 基于live555的一个简单RTSP服务器

    1,编译live555源码目录下的 BasicUsageEnvironment.groupsock.liveMedia.UsageEnvironment四个工程生成相应的库文件: 目录结构如下: 2, ...

随机推荐

  1. 页面PC端 / 移动端整屏纵向翻页,点击/触摸滑动效果功能代码非插件

    页面翻页,滑动功能示范代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  2. sar网络统计数据

    sar是一个研究磁盘I/O的优秀工具.以下是sar磁盘I/O输出的一个示例. 第一行-d显示磁盘I/O信息,5 2选项是间隔和迭代,就像sar数据收集器那样.表3-3列出了字段和说明. 表3-3    ...

  3. vue-eslint配置文件

    做项目的时候,我把eslint设置为了false,可想而知提交会产生的冲突 让我一个一个解决肯定不可能的,eslint的rule很多 在vue的配置文件.eslintrc.js中配置以下选项 这样只需 ...

  4. nodeJs基础方法

    Node.js 是一个基于Chrome javascript 运行时建立的一个平台, 用来方便地搭建快速的 易于扩展的网络应用 Node.js 借助事件驱动, 非阻塞I/O 模型变得轻量和高效, 非常 ...

  5. 微服务开源生态报告 No.7

    「微服务开源生态报告」,汇集各个开源项目近期的社区动态,帮助开发者们更高效的了解到各开源项目的最新进展. 社区动态包括,但不限于:版本发布.人员动态.项目动态和规划.培训和活动. 非常欢迎国内其他微服 ...

  6. 存储过程调用http 服务

    --sql 服务器设置 --启动 OLE Automation Proceduressp_configure 'show advanced options', 1;   --此选项用来显示sp_con ...

  7. 地不安装Oracle,plsql远程连接数据库

    由于Oracle的庞大,有时候我们需要在只安装Oracle客户端如plsql.toad等的情况下去连接远程数据库,可是没有安装Oracle就没有一切的配置文件去支持.最后终于发现一个很有效的方法,Or ...

  8. iOS 9 学习系列:Split Screen Multitasking

    http://www.cocoachina.com/ios/20151010/13601.html iOS 9 的一个重大变化就是增加了多任务,这个多任务允许用户在屏幕上同时运行多个 app.有两种形 ...

  9. oracle如何检查用户是否用了默认密码

    如果使用默认密码,很可能就对你的数据库造成一定的安全隐患,那么可以使用如下的查询获得那些用户使用默认密码 select username "User(s) with Default Pass ...

  10. DCOJ5117 set

    题目描述 给定一个数集 A,要求构造一个数集 B,满足: • 对于 A 集合中任意的数 x,x 属于 B,即 A ⊆ B: • 对于 B 集合中任意的数 a, b,(a + b) mod p 属于 B ...