01 直播技术相关

一.原理

直播原理

将主播录制的音视频, 推送到服务器, 再由服务器分发给观众

直播环节

  • 推流端: 采集 处理 编码 推流

  • 服务端处理: 转码 录制 截图 审核

  • 播放器: 拉流 解码 渲染

  • 互动: 聊天室 礼物 赞

二.相关框架

采集端

  • 数据采集

    • AVFoundation

  • 美颜

    • GPUImage

  • 音频压缩

    • FFmpeg

  • 视频压缩

    • X264

  • 推流

    • libremp

播放端

  • 播放

    • ijkplayer

  • 视频解码

    • FFmepeg

  • 视频硬解码

    • VideoToolBox

  • 音频硬解码

    • AudioToolBox

三.流媒体

  • 流媒体开发

    • 网络层Socket负责传输

    • 协议层RTMPHLS负责网络打包

    • 封装层FLVTS负责编解码数据的封装

    • 编码层h.264acc负责图像视频的压缩

  • GOP

    • 画面组,一个GOP就是一组连续的画面,每个画面都是一帧,一个GOP就是很多帧的集合

  • 码率

    • 图片压缩后每秒显示的数据量

    • 常常看见视频播放软件中的1024,720、高清、标清和流畅等,指的就是各种码率

  • 帧率

    • 每秒帧数

    • 人眼16帧的话看起来就是连贯的了

  • 压缩比

    • 压缩前的每秒数据量/码率

    • 同一视频源,压缩比越高画质越差

  • 视频封装格式和视频压缩编码标准

    • 就好像项目工程和编程语言,封装格式就是一个项目的工程,视频编码方式就是编程语言,一个项目工程可以用不同语言开发

四.推流

数据传输框架

librtmp是用来传输RTMP协议格式的数据

数据传输协议

  • RTMP是实时消息传输协议,Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议,因为是开放协议所以都可以使用了

  • RTMP协议用于对象、视频、音频的传输。这个协议建立在TCP协议或者轮询HTTP协议之上。

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

五.拉流

直播协议选择

  • 即时性要求高或有互动需求可以采用RTMP/RTSP

  • 有回放或跨平台需求的HLS

直播协议对比

HLS

  • HLS是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。可实现流媒体的直播和点播,主要应用在iOS系统。 HLS是以点播的技术方式来实现直播。

  • HLS是自适应码率流播,客户端会根据网络状况自动选择不同码率的视频流,条件允许的情况下使用高码率,网络繁忙的时候使用低码率,并且自动在二者间随意切换。这对移动设备网络状况不稳定的情况下保障流畅播放非常有帮助。

  • 实现方法是服务器端提供多码率视频流,并且在列表文件中注明,播放器根据播放进度和下载速度自动调整。

  • HLS与RTMP对比:HLS主要是延时比较大,RTMP主要优势在于延时低。

  • HLS协议的小切片方式会生成大量的文件,存储或处理这些文件会造成大量资源浪费。

  • 相比使用RTSP协议的好处在于,一旦切分完成,之后的分发过程完全不需要额外使用任何专门软件,普通的网络服务器即可,大大降低了CDN边缘服务器的配置要求,可以使用任何现成的CDN,而一般服务器很少支持RTSP。

HTTP-FLV

  • HTTP-FLV是基于HTTP协议流式的传输媒体内容。相对于RTMP,HTTP更简单和广为人知,内容延迟同样可以做到1~3秒,打开速度更快,因为HTTP本身没有复杂的状态交互。所以从延迟角度来看,HTTP-FLV要优于RTMP。

RTSP

  • RTSP:实时流传输协议,定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。

RTP

  • RTP:实时传输协议,RTP是建立在UDP协议上的,常与RTCP一起使用,其本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于低层服务去实现这一过程。

  • RTCP:RTP的配套协议,主要功能是为RTP所提供的服务质量(QoS)提供反馈,收集相关媒体连接的统计信息,例如传输字节数,传输分组数,丢失分组数,单向和双向网络延迟等等。

六.解码

解封装

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

音频编码框架

fdk_aac:音频编码解码框架,PCM音频数据和AAC音频数据互转

编码介绍

硬解码

  • GPU解码,减少CPU运算

    • 优点:播放流畅,低功耗,解码速度快,

    • 缺点:兼容不好

      软解码

  • CPU解码

    • 优点:兼容好

    • 缺点:加大CPU负担,解码速度慢,耗电增加,没有硬解码流畅

七.播放

ijkplayer

  • B站开源的一个基于FFmpeg的开源Android/iOS视频播放器

    • API易于集成

    • 编译配置可裁剪,方便控制安装包大小

    • 支持硬件加速解码,更加省电

    • 简单易用,指定拉流URL,自动解码播放

参考

http://www.woshipm.com/pd/408632.html/comment-page-1

Last updated