C语言开同样缓缓仿映客的直播App?看自己就足足了

无异于、直播现状简介

Linkee.10

1.术实现规模:

艺相对还比成熟,设备呢都支持硬编码。IOS还提供现成的 Video
ToolBox框架,可以本着摄像头及流媒体数据结构进行处理,但Video
ToolBox框架只是相当8.0以上版本,8.0之下即得用x264之库软编了。

github上发生现成的开源实现,推流、美颜、水印、弹幕、点赞动画、滤镜、播放都发出。技术其实不是格外麻烦,而且现在很多云厂商都提供SDK,七牛云、金山云、乐视云、腾讯云、百度云、斗鱼直播伴侣推流端,功能几乎都是一律的,没啥亮点,不同的凡一切直播平台服务差异以及联网的简易性。后端现在
RTMP/HTTP-FLV 清一色,App挂个源站直接接入抱道厂商还是CDN就OK。

2.直播优化层面

其实最麻烦之难关是增高首播时、服务品质就Qos(Quality of
Service,服务品质),如何以丢包率20%底情状下还能够维持平安、流畅的直播体验,需要考虑以下方案:

1.也加速首播时,收流服务器主动推送 GOP :(Group of
Pictures:策略影响编码质量)所谓GOP,意思是打面组,一个GOP就是平组连的镜头及边缘节点,边缘节点缓存
GOP,播放端则足以很快加载,减少回源延迟

GOP.1

2.GOP丢帧,为缓解延时,为什么会产生延时,网络抖动、网络堵塞导致的多少发送不出来,丢了后有的年月戳都设改,切记,要无客户端就会卡一个
GOP的日,是由于 PTS(Presentation Time
Stamp,PTS主要用于度量解码后的视频帧什么时给出示出来) 和 DTS
的来头,或者播放器修正 DTS 和 PTS 也推行(推流端丢GOD更复杂,丢 p 帧之前的
i 帧会花屏)

帧.2

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.TCP:TCP为点对点之说道,虽然能担保了多少传的可靠性,但是本着服务器资源耗费较充分,在数量流大的场所难以保证数据流传输的实时性。

2.UDP:UDP为不可因传输协议,不需要维护连接状态,也非以为每个数据包都必须达接受端,因此网络负荷比TCP小,传输速度也要于TCP快;但以网更加轧时,越有还多之数包丢。

3.RTMP:RTMP一个特别为高速传输视频,音频和多少要规划之商谈。它通过建一个二进制TCP连接要连续HTTP隧道实现实时的视频和声音传。

4.FFmpeg:FFmpeg是一致拟好就此来记录、转换数字音频、视频,并会以那个转会为流的开源计算机程序。采用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

框架支持RTMP(Real 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优化了之ijkplayer(),ijkplayer是冲FFmpeg的跨平台播放器,这个开源项目早就深受多只
App 使用,其中映客、美拍和斗鱼使用了 ijkplayer(5700+️)
。在本文的末未提供了,已经起包好之ijkplayer,直接拖入路即使可以下。省去了编译的进程(编译十分劳神,并且爱失误)。播放端调用ijkplayer参考VoideSun的简仿映客所形容,如有关于ijkplayer的问题,可以请教这员大牛。
VoiderSun

- (void)goPlaying {

    //获取url
    self.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播放。别人家的服务器,不建议推流时间了长(<
1分钟),建议搭建好的RTMP服务器,详情请见我之别一样首简书文章。

  • #### 类地址520Linkee:GrayJIAXU/520Linkee

受无架设服务器的意中人来平等套有利于:备用服务器地址(亲测可用):

  • rtmp://live.hkstv.hk.lxdns.com:1935/live/stream123

  • rtmp://live.hkstv.hk.lxdns.com:1935/live/hks
    (将hks名称变更成为外的,比如aaa)

  • rtmp://202.69.69.180:443/live/aaa
    (rtmp://202.69.69.180:443/webcast/bshdlive-pc)

  • rtmp://v1.one-tv.com:1935/live/aaa(rtmp://v1.one-tv.com:1935/live/mpegts.stream))

  • rtmp://203.207.99.19:1935/live/aaa(rtmp://203.207.99.19:1935/live/CCTV1))

  • rtmp://202.117.80.19:1935/live/aaa
    (rtmp://202.117.80.19:1935/live/live4)

  • rtmp://ams.studytv.cn/live/aaa
    (rtmp://ams.studytv.cn/livepkgr/264)

  • rtmp://60.174.36.89:1935/live/aaa
    (rtmp://60.174.36.89:1935/live/vod3)

联系我

GitHub

简书