基于LIVE555的RTSP QoS实现
如何从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实现的更多相关文章
- 基于Live555,ffmpeg的RTSP播放器直播与点播
基于Live555,ffmpeg的RTSP播放器直播与点播 多路RTSP高清视频播放器下载地址:http://download.csdn.net/detail/u011352914/6604437多路 ...
- 基于live555的视频直播 DM368IPNC RTSP分析
因需要,从个人的理解顺序和需求角度对live555的分析与开发整理,包含RTSP Server与RTSP Client.如何直播H.264流与JPEG流等,均进行了探讨,对live555的初学者有一定 ...
- EasyRTSPClient:基于live555封装的支持重连的RTSP客户端RTSPClient
今天先简单介绍一下EasyRTSPClient,后面的文章我们再仔细介绍EasyRTSPClient内部的设计过程: EasyRTSPClient:https://github.com/EasyDar ...
- 【视频开发】RTSP SERVER(基于live555)详细设计
/* *本文基于LIVE555的嵌入式的RTSP流媒体服务器一个设计文档,个中细节现剖于此,有需者可参考指正,同时也方便后期自己查阅.(本版本是基于2011年的live555) 作者:llf_17@q ...
- 基于Live555实现RtspServer及高清高分辨率和高码率视频传输优化
基于Live555实现RtspServer及高清高码率视频传输优化 最近做了一些pc和嵌入式平台的RTSP服务器项目,大多数的要求是简单但是功能全面,并且性能还要强劲.综合考虑后,基本都是在基于liv ...
- 基于live555实现的RTSPServer对底层进行性能优化的方法
在博客<EasyIPCamera高性能摄像机RTSP服务器RTSPServer解决方案>我介绍了基于live555实现的一套RTSPServer功能组件,当时开发者经过几个月的调试,已经将 ...
- 调用Live555接收RTSP直播流,转换为Http Live Streaming(iOS直播)协议
Live555接收RTSP直播流,转换Http Live Streaming(iOS直播)协议 RTSP协议也是广泛使用的直播/点播流媒体协议,之前实现过一个通过live555接收RTSP协议,然后转 ...
- 基于live555开发嵌入式linux系统的rtsp直播服务
最近要搞一个直播服务,车机本身是个前后双路的Dvr,前路1080P 25fps,后路720P 50fps,现在要连接手机app预览实时画面,且支持前后摄像头画面切换. 如果要做直播,这个分辨率和帧率是 ...
- 基于live555的一个简单RTSP服务器
1,编译live555源码目录下的 BasicUsageEnvironment.groupsock.liveMedia.UsageEnvironment四个工程生成相应的库文件: 目录结构如下: 2, ...
随机推荐
- Django--登录功能
登录功能: 1.路由访问如果不加斜杠,内部会重定向加斜杠的路由 所有的html文件都默认卸载templates文件夹下面 所有的(css,js,前端第三方的类库)默认都放在static文件夹下 htm ...
- Oracle删除当前用户下所有的表的方法1
1.如果有plsql客户端,则可以使用该用户登录,选中所有表 右键Drop即可. 2.如果有删除用户的权限,则可以: ? 1 drop user user_name cascade; 加了cascad ...
- 【Codeforces Round #430 (Div. 2) D】Vitya and Strange Lesson
[链接]点击打开链接 [题意] 给出一个数组,每次操作将整个数组亦或一个数x,问得到的数组的结果中的mex.mex表示为自然数中第一个没有出现过的数. [题解] 异或的效果是可以累加的,所以不用每次都 ...
- webpack--安装,使用
1. webpack 1.1. webpack介绍 webpack是一个资源的打包工具,目前最新为webpack3,可以将 .js, .css , image等静态资源当做一个模块来进行打包,那么每一 ...
- CSS3渐变效果
一.线性渐变linear-gradient 1.使用方法: background:-webkit-linear-gradient(red,blue);background:-moz-linear-g ...
- 【JZOJ3216】【SDOI2013】淘金
╰( ̄▽ ̄)╭ 小 Z在玩一个 叫做<淘金者>的游戏.游戏的世界是一个 二维坐标 .X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共 N*N 块. 一阵风吹过 ...
- 从php到浏览器的缓存机制
所有的php程序员都知道在php脚本里面执行 echo “1”;访客的浏览器里面就会显示“1”. 但是我们执行下面的代码的时候,并不是显示“1”之后5秒再显示“2”,而是等待5秒后直接显示“12” 这 ...
- mongoDB端口启动失败原因
删除以下文件: (所以数据会丢失,需要重新创建数据库)
- AI种黄桃AI卖黄桃 阿里巴巴推进一站式政务服务
7月11日,武汉城市峰会期间,武汉.枣阳.荆门等多个城市发布了同阿里巴巴的最新合作.这些合作包括用人工智能改善武汉交通拥堵.降低枣阳黄桃种植成本.提升荆门城市治理和市民服务水平等.阿里云.蚂蚁金服.高 ...
- PHP:测试SQL注入以及防止SQL注入
在写登录注册的时候发现了SQL和JS注入这个危害网站的用户举动: 测试方法: SQL注入: 先来做一个测试: 用户名:’ or 1 # 密码:随便写8位以上 验证码:写正确 好吧,就那么简单就进去了: ...