如何打造一款直播App(方法流程)

概要

分享内容

互联 内容载体变迁历程,文字——图片/声音——视频——VR/AR——…….。从直播1.0秀场时代(YY),2.0游戏直播(斗鱼、虎牙、熊猫)到如今全民直播3.0泛生活娱乐时代(映客、花椒),国外直播app(Meerkat 、Periscope),随着VA/AR/MR提出的沉浸式视听体验,直播4.0时代很快就能到来。

先将这些APP按照视频 站按照视频 站、弹幕视频、直播平台、在线秀场、移动短视频、移动直播来划分类别。再按照内容和 交这个维度来进行区分,可以明显看出视频 站、弹幕 站和直播平台更偏内容,他们对内容的需求更加高,用户在上面进行 交沉淀相对比较浅。

录制->编码-> 络传输->解码->播放

以上为直播的整体流程,根据该流程分为以下技术点:

  1. 怎样录制直播视频
  2. 怎样实时上传直播视频
  3. 怎样播放直播视频
  4. 直播间的用户是如何交互

一、移动视频直播发展

PC直播(固定场所)——>移动端(形式自由)。

随着越来越多的直播类 App 上线,移动直播进入了前所未有的爆发阶段,目前大多数移动直播以 Native 客户端为主。但是H5端的直播在移动直播端也承载着不可替代的作用,例如 H5 有着传播快,易发布的优势。

完整的直播包括:

  1. 视频录制端 
    电脑上的音视频输入设备或者手机端的摄像头或者麦克风,目前以移动端的手机视频为主。
  2. 视频播放端 
    可以是电脑上的播放器,手机端的 Native 播放器,还有 H5 的 video 标签等。
  3. 流媒体服务器端 
    用来接受视频录制端提供的视频源,同时提供给视频播放端流服务。目前开源的流媒体有RED5,CRTMPD,NGINX-RTMP,SRS。

二、录制视频

如何生产视频数据

每个Tag前面还包含了Previous Tag Size字段,表示前面一个Tag的大小。Tag的类型可以是视频、音频和Script,每个Tag只能包含以上三种类型的数据中的一种。图2展示了FLV文件的详细结构。

  • Video Tag 

  • 如图以Android为例的推流的流程图: 

    2、推流

    所谓推流,就是将我们已经编码好的音视频数据发往视频流服务器中,常用的第三方库 librtmp-iOS 进行推流,librtmp 封装了一些核心的 API 供使用者调用。例如推流 API 等等,配置服务器地址,即可将转码后的视频流推往服务器。一般的推流服务器都配置了服务器端信息。

    推流SDK

    百度云推流SDK: 官方文档 
    七牛推流SDK: Github上的官方源码及说明 
    易云推流SDK:官方文档 
    腾讯云推流SDK:官方文档 
    其他推流SDK: 
    https://github.com/daniulive/SmarterStreaming 
    https://github.com/leixiaohua1020/simplest_ffmpeg_mobile 
    https://github.com/begeekmyfriend/yasea 
    https://github.com/simple-rtmp-server/srs-sea

    推流服务器

    那么如何搭建一个推流服务器呢/p>

    简单的推流服务器搭建,服务器支持 RTMP ,大概需要以下几个步骤:

    1. 安装一台 nginx 服务器。
    2. 安装 nginx 的 RTMP 扩展,目前使用比较多的是 https://github.com/arut/nginx-rtmp-module
    3. 配置 nginx 的 conf 文件
    4. 重启 nginx,将 RTMP 的推流地址写为 rtmp://ip:1935/hls/mystream, 其中 hls_path 表示生成的 .m3u8 和 ts 文件所存放的地址,hls_fragment 表示切片时长,mysteam 表示一个实例,即将来要生成的文件名可以先自己随便设置一个。 
      更多配置可以参考:https://github.com/arut/nginx-rtmp-module/wiki/

    下面是 nginx 的配置文件 

    四、播放直播视频

    如何看

    下载直播视频有以下方式: 
    1. HLS 
    2. rtmp 
    3. flv

    好看的指标参数 
    码率:影响体积,与体积成正比:码率越大,体积越大;码率越小,体积越小。 
    帧率:影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。如果码率为变量,则帧率也会影响体积,帧率越高,每秒钟经过的画面越多,需要的码率也越高,体积也越大。 
    分辨率:影响图像大小,与图像大小成正比:分辨率越高,图像越大;分辨率越低,图像越小。

    1、HLS

    对于H5视频播放,可以使用 HLS(HTTP Live Streaming)协议播放直播流,iOS和 Android 都天然支持这种协议,配置简单,直接使用 video 标签即可。

    使用 video在移动客户端上播放直播视频:

    HTTP Live Streaming

    HLS是一个由苹果公司提出的基于HTTP的流媒体 络传输协议。

    HLS直播最大的不同在于,直播客户端获取到的,并不是一个完整的数据流。

    HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。

    由此可见,基本上可以认为,HLS是以点播的技术方式来实现直播。由于数据通过HTTP协议传输,所以不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点决定了延迟一般总是会高于普通的流媒体直播协议。

    每一个 .m3u8 文件,分别对应若干个 ts 文件,这些 ts 文件才是真正存放视频的数据,m3u8 文件只是存放了一些 ts 文件的配置信息和相关路径,当视频播放时,.m3u8 是动态改变的,video 标签会解析这个文件,并找到对应的 ts 文件来播放,所以一般为了加快速度,.m3u8 放在 Web 服务器上,ts 文件放在 CDN 上。

    支持的视频流编码为H.264,音频流编码为AAC。

    简单讲就是把整个流分成一个个小的,基于 HTTP 的文件来下载,每次只下载一些,前面提到了用于 H5 播放直播视频时引入的一个 .m3u8 的文件,这个文件就是基于 HLS 协议,存放视频流元数据的文件。

      声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2016年10月1日
    下一篇 2016年10月1日

    相关推荐