流媒体转发的遇到的一些问题

在windows下开发流媒体转发,遇到了不少问题,汇总一把

1.第一个是有时候会莫名其妙的卡死,检查了不少代码,也没发现问题,

不过发现一个现象,printf()打印的终端,没显示最近的日志,按enter,会出来很多日志,在网上找了好久

http://www.cnblogs.com/jwk000/p/6194525.html

发现这兄弟和我遇见的情况一致,可能是打印缓冲区满了导致的,也有可能其他原因(大神知道的可以告诉我),最后在接收到心跳的时候加了system(“cls”),就没出现过,可能windows真的不适合服务器开发

2.使用close关闭boost的socket的时候奔溃

boost::asio::ip::tcp::socket socket(io_service);
boost::asio::socket_base::linger option(true, 0);
socket.set_option(option);
....
socket.close();

这个是多线程问题,这边关闭,另一边却不知道,还在操作,所以崩溃

socket.shutdown(tcp::socket::shutdown_both);    

shutdown就不会,官方注释也是这样推荐的

3.udp接收到的数据不能正常正常解析

不停调试发现是udp socket的缓存区的大小设置太小,要找的适合自己程序的值

    int nRecvBuf = 1024 * 1920 * 1090;
    //int nRecvBuf = 1024*1024*100;
    int iResult = setsockopt(NodeRecSocket, SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf, sizeof(int));
    if (SOCKET_ERROR == iResult)
    {
        LOG_ERROR << "setsockopt error " << WSAGetLastError();
        WSACleanup();
        return;
    }

4.sleep(1)的实际休眠时间,在传递数据的时候,为了保证数据的有序,使用了sleep(1),循环一次不明显,循环多次视频明显延迟很多,所以查了一下sleep(1)

不查不知道,一查吓一跳,sleep(1)的实际时间取决于 系统时间精度,cpu核个数,CPU分配的时间片,以及线程调度的时候上下文切换,等等一系列因素,有的电脑测出来休眠了10毫秒,简直无法忍受,有的测出来0.6-0.8ms

目前没有好的办法,我只用sleep(0),让渡出去,让系统决定时间

5.以前的流媒体转发设计是,使用了一个线程,重复做如下工作

  a.读取视频流udp数据

  b.解析udp数据

  c.向所有请求的远端转发udp数据

  d.重复a-c;

这样的设计出现一个很大的问题就是

延时的积累,因为b,c都是耗时操作,而且要耗时操作执行完才能读取下一次的数据,这个时候可能udp的缓存区已经积累的大量的数据,而且udp每次只能读一个包

有时候延时很严重,延时一分钟两分钟,直至最后卡死

所以我改写了流程

1.新建一个数组存放udp数据,数组的每个元素存放一个udp包,数组的长度依据期望的延时来设置,

视频大小 分辨率 建议码率
480P 720X480 1800Kbps
720P 1280X720 3500Kbps
1080P 1920X1080 8500Kbps

我最大的延时忍受值是5秒,传输的视频是1920*1080   也就是5*8500Kbps=41KB    每个元素存放1024byte数据,所以就是40个元素,(考虑到特殊情况I帧比较多的时候)我放大了一点60个元素

2.新建两个线程,一个专门读取udp传输过来数据,放入数组,记录读取下标。另一个转发数据,记录转发下标(加锁,防止读写冲突)

如果读取udp传输过来数据的位置马上追上了转发数据的位置,那说明已经延时5秒,直接丢弃前五秒的数据,把转发数据的位置移到读取传输数据的前一个位置

时间: 2024-08-28 11:20:45

流媒体转发的遇到的一些问题的相关文章

Rtsp to Rtmp流媒体转发

RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信.支持该协议的软件包括Adobe Media Server.Ultrant Media Server.red5.nginx. HTTP Live Streaming(HLS)是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,相对于常见的流媒体直播协议,例如RTMP协议.RTSP协议.MMS协议 等,HLS直播

easyDarwin--开源流媒体实现

EasyDarwin 是由国内开源流媒体团队开发和维护的一款开源流媒体平台框架,从2012年12月创建并发展至今,从原有的单服务的流媒体服务器形式,扩展成现在的云平台架构的开源项目,更好地帮助广大流媒体开发者和创业型企业快速构建流媒体服务平台,更快.更简单地实现最新的移动互联网(安卓.IOS.微信)流媒体直播与点播的需求,尤其是安防行业与互联网行业的衔接: 云平台结构 目前EasyDarwin流媒体平台整套解决方案包括有:EasyCMS(中心管理服务),EasyDarwin(流媒体服务),Eas

手机Android音视频采集与直播推送,实现单兵、移动监控类应用

恰逢2014 Google I/O大会,不难看出安卓在Google的推进以及本身的开放性作用下,已经快延生到生活的各个方面了,从安卓智能手机.平板,到可穿戴的Android Ware.眼镜.手表.再到Android汽车.智能家居.电视,甚至最近看新闻,日本出的几款机器人都是Android系统的,再把目光放回监控行业,传统监控中的移动终端设备,例如:单兵设备.手持设备.车载终端设备,包括家庭监控中用到的智能设备,都可以用Android系统替代了,不仅开发容易,而且易扩展,设备也更加智能了. 图 -

视频监控/存储系统设计要点

视频监控系统包含下面组成部分: 编号 模块名称 功能及备注 1 设备代理 系统与前端设备进行通信 2 报警 接收/存储报警信息(外部报警) 3 流媒体 转发视频流,由于设备并发连接有限.通常配备多个网卡 4 设备接入 前端设备接入系统,一般通过onvif,rtsp或SDK,电力系统有自己的协议 5 存储 下文将重点描写叙述 6 联动 包含策略定义域运行 7 Web 跨平台可採用QtWebkit或mjpeg方式 8 电子地图 一般支持矢量图,在地图上叠加视频,支持多画面 9 级联 多级系统级联 1

用live555将内网摄像机视频推送到外网server,附源代码

近期非常多人问,怎样将内网的摄像机流媒体数据公布到公网,假设用公网与局域网间的port映射方式太过麻烦,一个摄像机要做一组映射,并且不是每个局域网都是有固定ip地址,即使外网主机配置好了每个摄像机的映射地址,也有可能会由于宽带公网ip地址变动而导致配置无效. 再换一个应用场景,当我们的全部IP摄像机都部署在一个没有有线网络的环境里面,全部的流媒体数据都要通过3G/4G网络公布出去.那么就必须有这么一个服务单元,可以通过先拉后推的方式,将内网的流媒体数据,推送并公布到外网的流媒体server上去:

Android IOS WebRTC 音视频开发总结(十)

继续上一篇中未翻译完成的部分,主要包括下面三个部分: 1,扩展:WebRTC多方通话. 2,MCU Multipoint Control Unit. 2, 扩展:VOIP,电话,消息通讯. 注意:翻译的时候不是逐字逐句的,而是按照自己的理解翻译的,同时为了便于理解,也加入一些自己组织的语言. 转载请说明出处: http://www.cnblogs.com/lingyunhu. 英文来自:http://www.html5rocks.com/en/tutorials/webrtc/infrastru

VLC客户端和SDK的简单应用

VLC_SDK编程指南 VLC 是一款自由.开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD.音频 CD.VCD 及各类流媒体协议.它可以支持目前市面上大多数的视频解码,除了Real. VLC_SDK的调用 VLC的SDK使用C语言写成,它的解码库部分的基础是FFMpeg,FFMpeg也是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序. VLC的SDK是在其客户端的安装文件根目录下,下载完VLC的客户端,并安装后,在其根目录下可以找到,例如 客户端安装

公园景区无线网络监控设计方案

公园是是旅游,休闲,文娱的大众活动场合,公园也是国际,国内经济活动和文化交流的首要场合,是一个城市旅游的首要景点,也是推进城市旅游休闲产业的发展,在公园咱们也要留意到一点即是安全的问题.大众场合人员密集,灯塔.水上广场,公园路灯夜景,公园停车场出进口.大门等都设有监视器机进行24小时监控. 无线网络变成景区视频传输运用首选 1.选用无线网络优点即是能够排除布线的麻烦,不需要损坏路面,修建物.无线网络只要在公园内架设基站和天线,无需对景区内的环境进行破坏;而传统的有线网络就需要改变景区内的环境,但

Nginx-rtmp 直播媒体实时流实现

0. 前言 这段时间在搭建一个IPCamera项目服务器.视频点对点通话,客户端会查看设备端的音视频实时流.为了省流量,是通过P2P进行穿透.但是由于NAT设备的原因和IPV4的枯竭.有些设备是无法进行点对点传输实时流.所以需要进行服务器转发.这里为了快速实现原型,同时参考现在主流的流媒体协议.发现很多使用的是RTMP协议. 下图是总体设计图,为了整合多平台,会自建RTMP流媒体服务器和使用云厂商SaaS的RTMP流媒体服务.但是由于有时候会传输一些非流媒体数据,需要传输一些二进制文件,所以会需