如何从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. 学习线程池源码--ScheduledThreadPoolExecutor

    1. 创建ScheduledThreadPoolExecutor        ScheduledThreadPoolExecutor继承自ThreadPoolExecutor,实现了Schedule ...

  2. linux查看现在在运行的进程 $ pstree -a$ ps aux

    这都是查看现有进程的. ps aux 的结果比较杂乱 pstree -a 的结果比较简单明了,可以看到正在运行的进程及相关用户.

  3. JavaScript Libraries In A TypeScript Application, Revisited

    If you haven’t already gotten involved with it, you’ll probably know that TypeScript is becoming inc ...

  4. openpyxl 模块的使用

    参考博客:https://www.cnblogs.com/anpengapple/p/6399304.html?utm_source=itdadao&utm_medium=referral 在 ...

  5. C++学习笔记----2.4 C++对象的内存模型

    转载自:http://c.biancheng.NET/cpp/biancheng/view/2995.html点击打开链接 当对象被创建时,编译器会为每个对象分配内存空间,包括成员变量和成员函数. 直 ...

  6. 高效整洁CSS代码原则 (下)

    6. 适当的代码注释 代码注释可以让别人更容易读懂你的代码,且合理的组织代码注释,可使得结构更加清晰.你可以选择做的样式表的开始添加目录: /*---------------------------- ...

  7. C++ 之手写strcat

    char *strcat(char* strDest, const char*strSrc){ assert(strDest != NULL&&strSrc != NULL); cha ...

  8. POJ1190 洛谷P1731 NOI1999 生日蛋糕

    生日蛋糕(蛋糕是谁?) Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20272   Accepted: 7219 Desc ...

  9. svn钩子(hooks)自动部署代码到web目录

      版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/li956732806/article/details/71158869   web目录:/hoe ...

  10. kubernetes1.4新特性:支持两种新的卷插件

    背景介绍 在Kubernetes中卷的作用在于提供给POD持久化存储,这些持久化存储可以挂载到POD中的容器上,进而给容器提供持久化存储. 从图中可以看到结构体PodSpec有个属性是Volumes, ...