如何从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.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】

    [题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...

  2. 门诊叫号系统系列-1.语音叫号 .net c#

    最近收到一个需求,朋友诊室需要做到门诊叫号,流程如下:病人选择医生-刷身份证排队-医生点击病人姓名叫号. 经过团队的努力,一个简易的门诊叫号系统已经完成.现在把各个功能记录下来,方便以后查看. 1.语 ...

  3. Struts_登录练习(配置拦截器)

    需求:类似过滤器看有没有登录,没登陆就返回登陆界面,在上文基础上实现 1.新建拦截器 2.配置拦截器 3.完成.

  4. BZOJ4719[NOIP2016提高组Day1T2] 天天爱跑步

    #261. [NOIP2016]天天爱跑步 描述 提交 自定义测试 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家 ...

  5. 怎么去掉select的下拉箭头和输入框input类型为number时的上下箭头

    一.去掉select的下拉箭头 方法一:在select外面加一个div,设置select宽度大于div的宽度,并加一个超出隐藏属性overflow:hidden,小三角会隐藏掉: 方法二:给selec ...

  6. JavaScript模式:字面量和构造函数

    本篇主要讨论了通过字面量以构造对象的方法,比如对象.数组以及正则表达式等字面量的构造方法,同时还讨论了与类似Object()和Array()等内置构造函数相比,为什么基于字面量表示法是更为可取. 对象 ...

  7. WCF 无管理员权限下启用服务

    1 使用 netsh.exe 工具 C:\Windows\system32>netsh http add urlacl url=http://+:8733/WcfServiceLibrary1 ...

  8. Django项目:CRM(客户关系管理系统)--13--05PerfectCRM实现King_admin注册功能获取内存02

    admin_class.model = modelself.registered_sites[app_name][model_name] = admin_class #注册APP #base_admi ...

  9. re模块相关

    一.正则表达式中的转义: "\" 表示转义符 [()+*?/$.] 在字符组中一些特殊的字符会现出原形 所有的\w \d \s (\n,\t) \W \D \S 都表示它原本的意义 ...

  10. 多云混合云之多集群统一管理:基于阿里云ACK统一纳管多个不同Kubernetes集群

    目前阿里云云原生产品家族已经支持多集群管理功能,允许使用阿里云容器服务Kubernetes(简称ACK)控制台或kubectl命令接入.统一纳管其他公有云.客户IDC自建K8s集群,集中管理部署K8s ...