网站标签中的图片怎么做的,为什么公司要做网站,濮阳做网站多少钱,小枫云主机直播应用中#xff0c;RTMP和HLS基本上可以覆盖所有客户端观看#xff0c;
HLS主要是延时比较大#xff0c;RTMP主要优势在于延时低。
一、应用场景
低延时应用场景包括#xff1a;
. 互动式直播#xff1a;譬如2013年大行其道的美女主播#xff0c;游戏直播等等各种…直播应用中RTMP和HLS基本上可以覆盖所有客户端观看
HLS主要是延时比较大RTMP主要优势在于延时低。
一、应用场景
低延时应用场景包括
. 互动式直播譬如2013年大行其道的美女主播游戏直播等等各种主播流媒体分发给用户观看。用户可以文字聊天和主播互动。
. 视频会议我们要是有同事出差在外地就用视频会议开内部会议。其实会议1秒延时无所谓因为人家讲完话后其他人需要思考思考的延时也会在1秒左右。当然如果用视频会议吵架就不行。 . 其他监控直播也有些地方需要对延迟有要求互联网上RTMP协议的延迟基本上能够满足要求。 本文福利 免费领取C音视频学习资料包学习路线大纲、技术视频/代码内容包括音视频开发面试题FFmpeg webRTC rtmp hls rtsp ffplay 编解码推拉流srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓ 二、RTMP和延时
1. RTMP的特点如下
1) Adobe支持得很好
RTMP实际上是现在编码器输出的工业标准协议基本上所有的编码器摄像头之类都支持RTMP输出。原因在于PC市场巨大PC主要是WindowsWindows的浏览器基本上都支持flashFlash又支持RTMP支持得非常好。
2) 适合长时间播放 因为RTMP支持的很完善所以能做到flash播放RTMP流长时间不断流当时测试是100万秒即10天多可以连续播放。对于商用流媒体应用客户端的稳定性当然也是必须的否则最终用户看不了还怎么玩我就知道有个教育客户最初使用播放器播放http流需要播放不同的文件结果就总出问题如果换成服务器端将不同的文件转换成RTMP流客户端就可以一直播放该客户走RTMP方案后经过CDN分发没听说客户端出问题了。
3延迟较低 比起YY的那种UDP私有协议RTMP算延迟大的延迟在1-3秒比起HTTP流的延时一般在10秒以上RTMP算低延时。一般的直播应用只要不是电话类对话的那种要求RTMP延迟是可以接受的。在一般的视频会议应用中RTMP延时也能接受原因是别人在说话的时候我们一般在听实际上1秒延时没有关系我们也要思考话说有些人的CPU处理速度还没有这么快。
4) 有累积延迟
技术一定要知道弱点RTMP有个弱点就是累积误差原因是RTMP基于TCP不会丢包。所以当网络状态差时服务器会将包缓存起来导致累积的延迟待网络状况好了就一起发给客户端。这个的对策就是当客户端的缓冲区很大就断开重连。
2. HLS低延时
主要有人老是问这个问题如何降低HLS延迟。
HLS解决延时就像是爬到枫树上去捉鱼奇怪的是还有人喊看那有鱼。
你说是怎么回事?
3. RTMP延迟的测量
如何测量延时是个很难的问题
不过有个行之有效的方法就是用秒表可以比较精确的对比延时。
经过测量发现在网络状况良好时 . RTMP延时可以做到0.8秒左右。 . 多级边缘节点不会影响延迟和SRS同源的某CDN的边缘服务器可以做到 . Nginx-Rtmp延迟有点大估计是缓存的处理多进程通信导致 . GOP是个硬指标不过SRS可以关闭GOP的cache来避免这个影响. . 服务器性能太低也会导致延迟变大服务器来不及发送数据。 . 客户端的缓冲区长度也影响延迟。
譬如flash客户端的NetStream.bufferTime设置为10秒那么延迟至少10秒以上。
4. GOP-Cache
什么是GOP就是视频流中两个I帧的时间距离。
GOP有什么影响
Flash解码器只有拿到GOP才能开始解码播放。
也就是说服务器一般先给一个I帧给Flash。
可惜问题来了假设GOP是10秒也就是每隔10秒才有关键帧如果用户在第5秒时开始播放会怎么样
第一种方案等待下一个I帧也就是说再等5秒才开始给客户端数据。这样延迟就很低了总是实时的流。
问题是等待的这5秒会黑屏现象就是播放器卡在那里什么也没有有些用户可能以为死掉了就会刷新页面。
总之某些客户会认为等待关键帧是个不可饶恕的错误延时有什么关系我就希望能快速启动和播放视频最好打开就能放
第二种方案马上开始放放什么呢
你肯定知道了放前一个I帧。
也就是说服务器需要总是cache一个gop这样客户端上来就从前一个I帧开始播放就可以快速启动了。
问题是延迟自然就大了。
有没有好的方案
有至少有两种
编码器调低GOP譬如0.5秒一个GOP这样延迟也很低也不用等待。
坏处是编码器压缩率会降低图像质量没有那么好。
5. 累积延迟
除了GOP-Cache还有一个有关系就是累积延迟。
服务器可以配置直播队列的长度服务器会将数据放在直播队列中如果超过这个长度就清空到最后一个I帧
当然这个不能配置太小譬如GOP是1秒queue_length是1秒这样会导致有1秒数据就清空会导致跳跃。 有更好的方法有的。 延迟基本上就等于客户端的缓冲区长度因为延迟大多由于网络带宽低服务器缓存后一起发给客户端现象就是客户端的缓冲区变大了譬如NetStream.BufferLength5秒那么说明缓冲区中至少有5秒数据。 处理累积延迟的最好方法是客户端检测到缓冲区有很多数据了如果可以的话就重连服务器。
当然如果网络一直不好那就没有办法了。
直播现状简介
想做一套直播系统
1.技术实现层面
技术相对都比较成熟设备也都支持硬编码。IOS还提供现成的 Video ToolBox框架可以对摄像头和流媒体数据结构进行处理但Video ToolBox框架只兼容8.0以上版本8.0以下就需要用x264的库软编了。
github上有现成的开源实现推流、美颜、水印、弹幕、点赞动画、滤镜、播放都有。技术其实不是很难而且现在很多云厂商都提供SDK七牛云、金山云、乐视云、腾讯云、百度云、斗鱼直播伴侣推流端功能几乎都是一样的没啥亮点不同的是整个直播平台服务差异和接入的简易性。后端现在 RTMP/HTTP-FLV 清一色App挂个源站直接接入云厂商或CDN就OK。
2.直播优化层面
其实最难的难点是提高首播时间、服务质量即QosQuality of Service服务质量如何在丢包率20%的情况下还能保障稳定、流畅的直播体验需要考虑以下方案
1.为加快首播时间收流服务器主动推送 GOP :Group of Pictures:策略影响编码质量)所谓GOP意思是画面组一个GOP就是一组连续的画面至边缘节点边缘节点缓存 GOP播放端则可以快速加载减少回源延迟
GOP.1
2.GOP丢帧为解决延时为什么会有延时网络抖动、网络拥塞导致的数据发送不出去丢完之后所有的时间戳都要修改切记要不客户端就会卡一个 GOP的时间是由于 PTSPresentation Time StampPTS主要用于度量解码后的视频帧什么时候被显示出来 和 DTS 的原因或者播放器修正 DTS 和 PTS 也行推流端丢GOD更复杂丢 p 帧之前的 i 帧会花屏
3.纯音频丢帧要解决音视频不同步的问题要让视频的 delta增量到你丢掉音频的delta之后再发音频要不就会音视频不同步
4.源站主备切换和断线重连
5.根据TCP拥塞窗口做智能调度当拥塞窗口过大说明节点服务质量不佳需要切换节点和故障排查
6.增加上行、下行带宽探测接口当带宽不满足时降低视频质量即降低码率
7.定时获取最优的推流、拉流链路IP尽可能保证提供最好的服务
8.监控必须要监控各个节点的Qos状态来做整个平台的资源配置优化和调度
直播过程.3
9.如果产品从推流端、CDN、播放器都是自家的保障 Qos 优势非常大
10.当直播量非常大时要加入集群管理和调度保障 Qos
11.播放端通过增加延时来减少网络抖动通过快播来减少延时
3.运营成本和客户体验
根据网上的数据斗鱼 TV 为 3 亿人民币战旗 TV 为 1.5 亿人民币龙珠为 1.2 亿人民币虎牙为 3000 万 人民币。
运营和推广这个就比较烧钱了一些做移动直播、游戏直播、秀场直播的A轮至少得上千万。
用户体验流畅、不卡顿、不花屏、断线重连、丢包策略、首画加载速度、丰富的礼物系统为了提高用户体验可以在后台加载其他页面数据但要在用户体验和内存优化方面找到平衡点。
流媒体传输
1.TCPTCP为点对点的协议虽然能保证了数据传输的可靠性但是对服务器资源耗费较大在数据流大的场合难以保证数据流传输的实时性。
2.UDPUDP为不可靠传输协议不需要维护连接状态也不认为每个数据包都必须到达接受端因此网络负荷比TCP小传输速度也要比TCP快但在网络越拥挤时越有更多的数据包丢失。
3.RTMPRTMP一个专门为高效传输视频音频和数据而设计的协议。它通过建立一个二进制TCP连接或者连接HTTP隧道实现实时的视频和声音传输。
4.FFmpegFFmpeg是一套可以用来记录、转换数字音频、视频并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案
协议差异.4
项目搭建采集端
1.目前比较知名的有VideoCore
目前国内很多知名的推流框架都是对VideoCore的二次开发。这个框架主要使用C写的支持RTMP推流但对于iOS开发者来说有点晦涩难懂精通C的除外。想开源和免费的可以选择现在的几个知名项目VideoCore GPUImage基于GPU的美颜滤镜 ,播放用IJKPlayer自己修改。
2.国内比较火的LiveVideoCoreSDK
框架提供IOS苹果手机的RTMP推流填写RTMP服务地址直接就可以进行推流SDK下载后简单的工程配置后能直接运行实现了美颜直播和滤镜功能基于OpenGL前后摄像头随时切换提供RTMP连接状态的回调。
这个框架是国内比较早的一款推流框架有不少在使用这个SDK功能非常齐全作者也比较牛用来学习推流采集相关内容非常好但是集成到工程中有些困难对于我来说。总的来说这是一款非常厉害的推流SDK几乎全部使用C写的编译效率非常好如果有实力的话推荐使用这个框架来做自己项目的推流端。
3.可读性比较好的推流LFLiveKit
框架支持RTMPReal Time Messaging Protocol 实时消息传输协议Adobe公司的。
HlS (HTTP Live Streaming) 苹果自家的动态码率自适应技术。主要用于PC和Apple终端的音视频服务。包括一个m3u(8)的索引文件TS媒体分片文件和key加密串文件。
推荐这个框架第一是因为它主要使用OC写的剩下的用C语言写的框架文件十分清晰这对不精通C的初学者提供了很大的便利并且拓展性非常强支持动态切换码率功能支持美颜功能。
4.美颜功能
美颜的话一般都是使用的GPUImage基于OpenGl开发纯OC语言这个框架十分强大可以做出各种不同滤镜可拓展性高。如果对美颜没有具体思路可以直接用BeautifyFace可以加入到项目中很方便的实现美颜效果。
项目具体搭建
1.如何实现美颜
美颜功能使用的是BeautifyFace它可以很快速的实现美颜功能效果不错它的底层还是基于的GPUImage对GPUImage十分喜爱的Developer可以参照BeautifyFace写出一个属于自己的美颜功能并且添加各种滤镜。
2.悬浮TabBar的实现
这个TabBar看着像是用自定义TabBar做的但事实上它还是用的系统的TabBar,给系统的tabBar.backgroundImage设置一张设计好的背景图片。
想做一套像映客的直播系统
TabBar.8
添加后会发现顶部有一条阴影线并且TabBar的高度也不够。阴影线与上图绿色线条之间变成了透明颜色实现下面方法隐藏阴影线并且调高TabBar的高度。
TabBar.9
//隐藏阴影线[[UITabBar appearance] setShadowImage:[UIImage new]];- (void)setupTabBarBackgroundImage { UIImage *image [UIImage imageNamed:tab_bg]; CGFloat top 40; // 顶端盖高度CGFloat bottom 40 ; // 底端盖高度CGFloat left 100; // 左端盖宽度CGFloat right 100; // 右端盖宽度UIEdgeInsets insets UIEdgeInsetsMake(top, left, bottom, right); // 指定为拉伸模式伸缩后重新赋值UIImage *TabBgImage [image resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch]; self.tabBar.backgroundImage TabBgImage;[[UITabBar appearance] setShadowImage:[UIImage new]];[[UITabBar appearance] setBackgroundImage:[[UIImage alloc]init]];}//自定义TabBar高度- (void)viewWillLayoutSubviews { CGRect tabFrame self.tabBar.frame;tabFrame.size.height 60;tabFrame.origin.y self.view.frame.size.height - 60; self.tabBar.frame tabFrame;}
3.播放端的实现
播放端用的针对RTMP优化过的ijkplayerijkplayer是基于FFmpeg的跨平台播放器这个开源项目已经被多个 App 使用其中映客、美拍和斗鱼使用了 ijkplayer5700⭐️ 。在本文的末未提供了已经打包好的ijkplayer直接拖入项目就可以使用。省去了编译的过程编译十分麻烦并且容易出错。
- (void)goPlaying { //获取urlself.url [NSURL URLWithString:_liveUrl];_player [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:nil]; UIView *playerview [self.player view]; UIView *displayView [[UIView alloc] initWithFrame:self.view.bounds]; self.PlayerView displayView;[self.view addSubview:self.PlayerView]; // 自动调整自己的宽度和高度playerview.frame self.PlayerView.bounds;playerview.autoresizingMask UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;[self.PlayerView insertSubview:playerview atIndex:1];[_player setScalingMode:IJKMPMovieScalingModeAspectFill];}
4.推送端的实现
使用的是LFLiveKit推流端可以选择很多GitHub上的开源项目替代LFLiveKit比如上面所提到的VideoCore,和LiveVideoCoreSDK。商用的话可以选择各大厂商的SDK网易直播云、七牛、腾讯、百度、新浪、其中金山直播云本人用过。使用直播云的好处就是能快速上线App功能十分齐全可以播放器和推流端服务器一套下来有专业客服人员帮助集成到工程中缺点就是流量费太贵了。
- (UIButton*)startLiveButton{ if(!_startLiveButton){_startLiveButton [UIButton new]; //位置_startLiveButton.frame CGRectMake((XJScreenW - 200) * 0.5, XJScreenH - 100, 200, 40);_startLiveButton.layer.cornerRadius _startLiveButton.frame.size.height * 0.5;[_startLiveButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];[_startLiveButton.titleLabel setFont:[UIFont systemFontOfSize:16]];[_startLiveButton setTitle:开始直播 forState:UIControlStateNormal];[_startLiveButton setBackgroundColor:[UIColor grayColor]];_startLiveButton.exclusiveTouch YES;__weak typeof(self) _self self;[_startLiveButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {_self.startLiveButton.selected !_self.startLiveButton.selected; if(_self.startLiveButton.selected){[_self.startLiveButton setTitle:结束直播 forState:UIControlStateNormal];LFLiveStreamInfo *stream [LFLiveStreamInfo new];stream.url rtmp://daniulive.com:1935/live/stream238;[_self.session startLive:stream];}else{[_self.startLiveButton setTitle:开始直播 forState:UIControlStateNormal];[_self.session stopLive];}}];} return _startLiveButton;}
stream.url是服务器的地址推流完成后使用VLC播放 本文福利 免费领取C音视频学习资料包学习路线大纲、技术视频/代码内容包括音视频开发面试题FFmpeg webRTC rtmp hls rtsp ffplay 编解码推拉流srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓