当前位置: 首页 > news >正文

中山网站建设策划做网站应该买哪一种服务器

中山网站建设策划,做网站应该买哪一种服务器,建设工程许可证在那个网站办,施工企业效能live555关于RTSP协议交互流程 live555的核心数据结构值之闭环双向链表 live555 rtsp服务器实战之createNewStreamSource live555搭建实时播放rtsp服务器 live555 rtsp服务器实战之doGetNextFrame live555可以说是rtsp的专项库#xff0c;既可以搭建rtsp服务器#xff0c;…live555关于RTSP协议交互流程 live555的核心数据结构值之闭环双向链表 live555 rtsp服务器实战之createNewStreamSource live555搭建实时播放rtsp服务器 live555 rtsp服务器实战之doGetNextFrame live555可以说是rtsp的专项库既可以搭建rtsp服务器也可以搭建rtsp客户端由于客户端可以由vlcpotplayer等工具代替这章主要讲解rtsp服务器的搭建过程 live555开源库可以说是很照顾用户了搭建rtsp服务器的流程很精简不用考虑太多按照流程搭建即可具体的流程参考live555源码例程ive555-master/testProgs/testOnDemandRTSPServer.cpp; 当然和其他开源库源码例程一样媒体流都是从文件中获取与实际的项目需求还是有一定差别的那么该怎么实现网络实时传输的rtsp服务器呢 首先看一下例程的源码(以h264媒体流为例) int main(int argc, char** argv) {// Begin by setting up our usage environment(首先设置我们的使用环境)://初始化调度任务的类。它负责管理任务的执行顺序和时间确保多线程环境中的任务正确执行。TaskScheduler* scheduler BasicTaskScheduler::createNew();//初始化基本操作环境的类。它封装了各种基本功能如内存管理、错误处理、日志记录等。//接受一个 TaskScheduler 对象作为参数并使用这个调度器来初始化环境。这确保了环境对象能够与调度器协同工作正确地调度和管理任务。env BasicUsageEnvironment::createNew(*scheduler);UserAuthenticationDatabase* authDB NULL;// Serve regular RTSP (over a TCP connection)://创建rtsp服务器的类里面创建了与客户端交互需要的ipv4和ipv6网络套接字,和各信令(OPTION DESCRIBE SETUP PLAY等)的处理函数RTSPServer* rtspServer RTSPServer::createNew(*env, 8554, authDB);if (rtspServer NULL) {*env Failed to create RTSP server: env-getResultMsg() \n;exit(1);}char const* descriptionString Session streamed by \testOnDemandRTSPServer\;char const* streamName h264ESVideoTest;char const* inputFileName test.264;//将streamName descriptionString等信息保存起来供交互时使用ServerMediaSession* sms ServerMediaSession::createNew(*env, streamName, streamName,descriptionString);int datalen 0;unsigned char *databuf nullptr;databuf (unsigned char *)malloc(1024);//将该H264VideoFileServerMediaSubsession媒体子会话加入到会话链表中咱们就是实现H264VideoFileServerMediaSubsession部分sms-addSubsession(H264VideoFileServerMediaSubsession::createNew(*env, inputFileName, reuseFirstSource));//将该会话添加到哈希表中key就是streamNameval就是smsrtspServer-addServerMediaSession(sms);//打印rtsp的访问url; test例程自定义的打印接口不在live555库里在实际项目中可以不实现announceStream(rtspServer, sms, streamName, inputFileName);//进入主循环循环监视双向闭环链表延时队列的状态运行响应的处理函数env-taskScheduler().doEventLoop(); // does not returnreturn 0; // only to prevent compiler warning } 为了方便阅读代码做了精简去掉了部分注释和不需要的代码这样整个服务器的搭建流程就已经很清晰明了了是不是很简单 注 媒体子会话一个流URL可能链接很多客户端每个客户端就是一个子会话。 来来来接下来就是重头戏啦我们怎么获取我们的网络媒体流呢 首先我们需要实现两个虚函数createNewStreamSource和doGetNextFrame这两个函数的作用及在源码的调度流程我的前两篇文章已经介绍过感兴趣的话点链接看详情 我们需要创建两个类来实现这两个虚函数 H264LiveVideoServerMediaSubssion类用于实现createNewStreamSource因为createNewStreamSource函数被声明在OnDemandServerMediaSubsession类中所以要继承OnDemandServerMediaSubsession类 class H264LiveVideoServerMediaSubssion : public OnDemandServerMediaSubsession {public:static H264LiveVideoServerMediaSubssion* createNew(UsageEnvironment env);protected: // were a virtual base classH264LiveVideoServerMediaSubssion(UsageEnvironment env);~H264LiveVideoServerMediaSubssion();protected: // redefined virtual functionsFramedSource* createNewStreamSource(unsigned clientSessionId,unsigned estBitrate);RTPSink* createNewRTPSink(Groupsock* rtpGroupsock,unsigned char rtpPayloadTypeIfDynamic,FramedSource* inputSource);}; 由于createNewRTPSink在OnDemandServerMediaSubsession类中也是纯虚函数所以也需要在子类中实现来看下函数实现 H264LiveVideoServerMediaSubssion* H264LiveVideoServerMediaSubssion::createNew(UsageEnvironment env, Boolean reuseFirstSource) {return new H264LiveVideoServerMediaSubssion(env, reuseFirstSource); }H264LiveVideoServerMediaSubssion::H264LiveVideoServerMediaSubssion(UsageEnvironment env, Boolean reuseFirstSource) : OnDemandServerMediaSubsession(env, reuseFirstSource) { }H264LiveVideoServerMediaSubssion::~H264LiveVideoServerMediaSubssion() { }FramedSource* H264LiveVideoServerMediaSubssion::createNewStreamSource(unsigned clientSessionId, unsigned estBitrate) {/* Remain to do : assign estBitrate */estBitrate 1000; // kbps, estimate//创建视频源H264FramedLiveSource* liveSource H264FramedLiveSource::createNew(envir());if (liveSource NULL){return NULL;}// Create a framer for the Video Elementary Stream:return H264VideoStreamFramer::createNew(envir(), liveSource); } RTPSink* H264LiveVideoServerMediaSubssion::createNewRTPSink(Groupsock* rtpGroupsock,unsigned char rtpPayloadTypeIfDynamic,FramedSource* /*inputSource*/) {return H264VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); } createNewStreamSource函数是需要我们实现的函数函数创建了H264FramedLiveSource类对象这个类对象就是我们实现doGetNextFrame函数的类createNewRTPSink函数不需要自己实现之间创建H264VideoRTPSink类即可 接下来看一下H264FramedLiveSource类该类的doGetNextFrame指明了怎么获取媒体流读取媒体流的方法因为doGetNextFrame是在FramedSource中声明的纯虚函数因此需要继承FramedSource类 class H264FramedLiveSource : public FramedSource { public:static H264FramedLiveSource* createNew(UsageEnvironment env);protected:H264FramedLiveSource(UsageEnvironment env);~H264FramedLiveSource();private:virtual void doGetNextFrame(); }; FramedSource类中只有一个doGetNextFrame纯虚函数用于获取媒体流其他不用实现doGetNextFrame函数的实现如下 H264FramedLiveSource::H264FramedLiveSource(UsageEnvironment env) : FramedSource(env) { }H264FramedLiveSource* H264FramedLiveSource::createNew(UsageEnvironment env) {H264FramedLiveSource* newSource new H264FramedLiveSource(env);return newSource; }H264FramedLiveSource::~H264FramedLiveSource() { }void H264FramedLiveSource::doGetNextFrame() {uint8_t *frameData nullptr;int frameLen 0;//获取视频帧该函数自己实现可以是接收网络帧也可以是读取本地数据Get_Video_Frame(frameData, frameLen);//赋值父类成员变量fFrameSize frameLenmemcpy(fTo, frameData, fFrameSize);// nextTask() envir().taskScheduler().scheduleDelayedTask(0,(TaskFunc*)FramedSource::afterGetting, this);//表示延迟0秒后再执行 afterGetting 函数//这个是必须的原因参考我关于doGetNextFrame的文章afterGetting(this);return; } 我是以帧的方式获取的视频流在实际的开发中不一定非要一次取一帧也不一定按帧取可以任意长度的数据live555内部会进行分帧 定义好这两个函数之后就可以修改main函数中的媒体流相关代码         //例程代码sms-addSubsession(H264VideoFileServerMediaSubsession::createNew(*env, inputFileName, reuseFirstSource)); //修改代码sms-addSubsession(H264LiveVideoServerMediaSubssion::createNew(*env, reuseFirstSource)); 至此rtsp服务器搭建完成其实过程很简单只不过第一次使用live555开源库有点不知从何下手当然live555源码的实现技巧运行流程也是很值得借鉴的源码分析我已经出了一些文章关注我了解更多 live555实现实时流rtsp服务器源码
http://www.zqtcl.cn/news/375888/

相关文章:

  • 上海青浦房地产网站建设广西建设人才网
  • 做网站的网络公司税收优惠推广优化关键词
  • 找能做网站的怎么查看网站备案号
  • 石嘴山北京网站建设h5网站建设
  • 滨州区建设局网站中国建行官网首页
  • 网站建设服务网站网站建设销售实习
  • 网站注册都需要什么给装修公司做推广的网站
  • me域名的网站wordpress 扩展字段
  • 新开三端互通传奇网站企业推广方式有哪些
  • 怎么制作网站页面做理论的网站
  • 哪家公司做跳转网站wordpress 网页缩放
  • 小说网站建设的支柱深圳建设发展集团有限公司
  • 陕西高速公路建设网站做网站不用编程
  • wordpress网站秒开网站建设设计理念
  • html5 网站模板永久免费的仓库管理软件
  • 贵州网站seo厦门网站设计多少钱
  • 哈市哪里网站做的好合作网站seo
  • 找苏州网站建设网站维护提醒php文件
  • 哪些网站做推广效果好与市场营销有关的网站
  • 有什么网站可以做设计赚钱吗专业vi设计公司哪家强
  • 一般的网站是由什么语言做的网站建设怎么问问题
  • 开源系统 网站阿里云虚拟主机网站
  • 摄影师作品网站网站怎么做搜素引擎
  • 做网站定金是多少钱开网站建设公司心得
  • 网站不备案怎么做网页淘宝客电子商务的网站建设的可用性
  • 傻瓜自助建站软件怎样进网站空间服务器
  • 黑龙江网站建站建设wordpress 邮件
  • 免费发布信息网站有哪些豆芽网站建设
  • 无锡做网站优化公司互动营销用在哪些推广上面
  • 每一个网站都是响应式吗销售渠道策略