如何从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. 2019-8-31-dotnet-Framework-源代码-类库的意思

    title author date CreateTime categories dotnet Framework 源代码 类库的意思 lindexi 2019-08-31 16:55:58 +0800 ...

  2. NOIP模拟 7.01

    水灾(sliker.cpp/c/pas) 1000MS  64MB 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没. CCY ...

  3. H5C3--FileReader和拖拽的应用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 使用mpvue开发github小程序总结

    前言 最近有点闲,想起关注已久的mpvue写小程序,所以稍微肝了半个多月写了个github版的微信小程序,已上线.现在总结一下遇到的坑. 扫码体验. 项目地址.https://github.com/c ...

  5. android非硬件加速绘制简单流程

    这里的硬件加速是指openGL + GPU 如果不适用硬件加速: 1 ViewRootImpl.java draw:if (!dirty.isEmpty() || mIsAnimating || ac ...

  6. git reset三种模式

    reset三种模式区别和使用场景 区别: --hard:重置位置的同时,直接将 working Tree工作目录. index 暂存区及 repository 都重置成目标Reset节点的內容,所以效 ...

  7. hdu 3466 01背包变形【背包dp】

    http://acm.hdu.edu.cn/showproblem.php?pid=3466 有两个物品P,Q,V分别为 3 5 6, 5 10 5,如果先dp第一个再dp第二个,背包容量至少要为3+ ...

  8. oracle Wrap加密

    wrap就是一个加密的工具 参数: Iname 输入文件的名称 Oname输出文件的名称 如何加密Oracle中的存储过程,从而在schema下看不到其源码? 软件环境: 1.操作系统:Windows ...

  9. MaxCompute 图计算用户手册(下)

    示例程序 强连通分量 在有向图中,如果从任意一个顶点出发,都能通过图中的边到达图中的每一个顶点,则称之为强连通图.一张有向图的顶点数极大的强连通子图称为强连通分量.此算法示例基于 parallel C ...

  10. 【NS2】新协议的添加示例(转载)

    1. 下表显示了 NS2 和 TCP/IP.OSI七层网络结构的大致对应关系(这个表很有好处哦) TCP       NS2     OSI     应用层     应用层    应用层 表示层 会话 ...