直播业务知识整理

直播相关

整理的一些直播业务下相关基础知识点。
直播相关知识点整理

参考链接

1采集

音频

  • 麦克风是否可用
  • 检测手机对某个音频采样率的支持
  • 音频采集时设置正确的缓冲区大小
  • 特殊场景如连麦进行回声消除

视频

  • 摄像头是否可用
  • 摄像头采集到的图像是横屏,需要进行旋转处理后进行展示
  • 各种手机屏幕大小比例特殊处理

2处理

处理内容

将视频帧进行加工,然后一帧一帧的渲染到屏幕上。

  • 美颜
  • 水印

处理框架技术

  • GPUImage

    基于 OpenGL ES 的一个强大的图像、视频处理框架,支持各种预定义以及自定义滤镜效果。

  • OpenGL

    Open Graphics Library 定义了一个跨编程语言、跨平台的编程接口的标准,是一个功能强大的,调用方便的底层图形库。

  • OpenGL ES

    OpenGL for Embedded Systems 是 OpenGL 的三维图形 API 的子集,针对手机,PDA 和游戏主机等嵌入式设备而设计。

3编解码

编码:将视频流,音频流等数据以特定的容器格式封装成文件

解码:将视频流、音频流字幕等合成的文件中(容器格式 FLV,TS)分解出视频,音频或者字幕,各自进行解码。

框架

  • FFMpeg

    一个跨平台的开原视频框架,能实现视频编码,解码,转码,串流,播放等丰富的功能。支持的视频格式以及播放协议非常丰富,几乎包含了所有的音视频编解码、封装格式以及播放协议。

  • libxxx

视频编码技术

对食品进行压缩(视频编码)或者解压缩(视频解码)。

主要目标是将视频像素数据压缩成视频码流,降低视频的数据量。

P-B-I 帧分别是什么:
I帧(关键帧)保留一幅完整的画面,解码时只需要本真数据就可以完成。

P 帧(差别帧)保留这一帧和之前帧的差别,解码的时候需要用之前缓存的画面叠加本帧的差别,来生成最终的画面,所以可以看出 P 帧没有完整的画面数据,只有与前一帧的画面差别的数据,

B 帧(双向差别帧)保留的是本帧与前后帧的差别,解码 B 帧,不仅要取得之前的缓存画面,还需要解码之后的画面,通过前后画面与本帧的数据叠加来输出最终的画面。因为 B 真压缩率搞,所以几码的时候会比较消耗 CPU。

  • MPEG

    采用帧间压缩,仅仅存储连续帧之间有差别的地方,从而达到比较大的压缩比。

  • H.264/AVC

    采用实现预测(和 MPEG 中的 P-B 帧一样的帧预测压缩算法),可以根据需要产生网络情况传输的视频流,拥有更高的压缩比和更好的图像质量。

  • H.265/HEVC

    基于 H.264,属于增强版

  • 合成muxing

    将视频流音频流甚至是字幕流封装到一个文件中(比如文件格式为 FLV,TS 等)作为一个信号进行传输。

音频编码技术

  • AAC

    音频编码技术,压缩音频用。

码率控制

视频播放软件中的 1024.720 高清标清流畅等,指的就是各种码率

视频封装格式

  • TS

    流媒体封装格式,不需要加载索引之后再播放,减少了首屏延迟

    两个 TS 片段可以无缝拼接,播放器得以连续播放

  • FLV

    流媒体文件封装格式,文件极小,加载速度很快。

解码

  • 硬解码

    用 GPU 来解码,减少了 CPU 运算。

    优点:播放流畅,功耗低,解码速度快。
    缺点:兼容性不好,厂商有关。

  • 软解码

    用 CPU 来解码

    优点:兼容性好
    缺点:耗CPU、功耗高,没有硬解码流畅,解码速度相对较慢。

传输

传输协议

  • RTMP

    实时消息传输协议,为播放器和服务器之间,音频视频以及数据传输开发的一套开放协议。

    建立在 TCP 协议之上

    RTMP 协议就像是一个用来封装数据包的容器,这些数据可以是 FLV 中的音视频数据,一个单一的链接可以通过不同的通道传输多路网络流(这些通道中的包都是按照固定的大小来进行传输的)

流媒体服务器

  • SRS
  • BMS
  • NGINX

数据分发

  • CDN

    • 推流地址
    • 拉流地址

推流

拉流

  • 直播协议对比

    • *RTMP

      比较全能,即可以用来推送,又可以用来直播。

      核心理念:将大块的视频帧和音频帧剁碎,然后以小数据包的形式在互联网上进行传输,支持加密。拆包组包比较复杂,海量并发时容易出现一些不可预测的稳定性问题。

    • *FLV

      只是在大块的视频帧和音频帧头部加入一些标记头信息,所以处理起来很方便。

      缺点:手机浏览器上的支持有限,但是手机端 APP 的直播协议却异常成熟,可以很好的使用。

    • *HLS

      基于 HTTP 协议实现,传输内容包括两部分:M3u8 描述文件➕TS 媒体文件
      可以实现流媒体的直播和点播
      (HLS 其实是以点播的形式来实现的直播,所以会有延迟,而且可以根据网络状态选择不同码率的视频流,实现的方法是服务器端提供多码率视频流清单)

      对比 RTMP。HLS 时延较大,RTMP 时延低;HLS 会产生大量文件,造成资源浪费。但好处是这些文件的存在让低端设备也能很好的处理。

    • HTTP-FLV

      基于 HTTP 协议实现的流式媒体传输。

      因为HTTP 本身没有很复杂的状态交互,所以从延迟角度看,HTTP-FLV 要优于 RTMP

    • RTSP

      实时流传输协议:定义了一对多应用程序如何有效地通过 IP 网络传输多媒体内容。

    • RTP

      基于 UDP 实现,本身没有按时发送和其他 Qos(服务质量保证),时延小,误差稍大。

      服务质量保证由 RTP 的配套协议 RTCP 来收集媒体连接的统计信息,如串数字结束,传输分组数,丢失分组数,单向和双向网络延迟等

  • 直播协议选择

    即时性要求较高,或者有互动需求的可以采用 RTMP,RTSP

    对有回放或者跨平台需求的,推荐使用 HLS。

互动

交互本身是个多模块互相配合的场景。先来大致描述下一个直播业务的场景。

打开 APP 一个热门页面(从打开 APP 开始就会和 PHP 接口层交互)
点击某一个房间(PHP 进行权限校验,返回合法用户需要的一些信息给 APP)
连 websocket,进行聊天直接交互
送礼,元数据中房间信息,主播信息等都可以拿得到。
送礼消息要展示给房间内其他用户,但是送礼本身走的是 PHP,而非 ws。所以需要借助 Redis 进行 pub/sub 做一次“透传”行为,让 ws 将对应的数据转发到房间内,让其他人看得到。

关于“透传”模型,这里有一个比较通俗的参考

聊天

  • websocket 服务器

    • netty-java 框架

    • 1协议升级,客户端参数传递链接

      第一步是客户端用 HTTP 来申请 upgrade,并传递过来一些服务器认证身份的参数,来避免外界干扰
      进行握手:
      Sec-WebSocket-Key1和Sec-WebSocket-Key2在旧的WEBSOCKET协议中是没有的,因为判断当前请求是否WEBSOCKET,主要还是通过请求头中的Connection是不是等于Upgrade以及Upgrade是否等于WebSocket,也就是说判断一个请求是否WEBSOCKET请求,只需要判断请求头中的Connection及Upgrade,判断新旧版本可以通过是否包含“Sec-WebSocket-Key1”和“Sec-WebSocket-Key2”。
      客户端请求
      Upgrade:websocket
      Connection:Upgrade
      服务器响应 101 状态码 切换协议,连接为 websocket连接

    • 2消息互联

业务交互

  • PHP 服务器

    • 业务机

      火星这边一般叫 get 机,也就是常说的业务机器,真正负责更新用户信息,房间信息以及CRUD等操作的执行。

      GET 机原则上来讲可以快速扩容,前提是代码环境准备好,因此一般为了避免雪崩,get 机群最好是有一两台随时准备上线的机器,一旦某些 get 机出问题,可以立即修改前端机 Nginx 配置来顶上去,减少业务损失。

    • 前端机

      负责业务请求转发与负载均衡。

      一般可以作为汇总请求日志来使用,但是要注意单点问题,一旦宕机,需要拿到 Nginx 配置然后迅速重启服务,

推拉流

推流

主播将本地视频源和音频源推送到云端服务器,有时也称为“RTMP 发布”

拉流

XMind: ZEN - Trial Version

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章