一、音视频采集
略
二、前处理
- 图像处理库 GPUImage(对
OpenGL
的 OC 封装),提供了丰富的预处理效果,也可以利用该库自定义设计。
三、编码
你需要知道的流媒体概念
流媒体开发
: 网络层(socket)负责传输,协议层(rtmp或hls)负责网络打包,封装层(flv、ts)负责编解码数据的封装,编码层(h.264和aac)负责图像,音频压缩。帧
: 每帧代表一幅静止的图像GOP
: (Group of Pictures)画面组,一个GOP就是一组连续的画面,每个画面都是一帧,一个GOP就是很多帧的集合- 直播的数据,其实是一组图片,包括I帧、P帧、B帧,当用户第一次观看的时候,会寻找I帧,而播放器会到服务器寻找到最近的I帧反馈给用户。因此,GOP Cache增加了端到端延迟,因为它必须要拿到最近的I帧
- GOP Cache的长度越长,画面质量越好
码率
:图片进行压缩后每秒显示的数据量。帧率
:每秒显示的图片数。影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。分辨率
:(矩形)图片的长度和宽度,即图片的尺寸压缩前的每秒数据量
: 帧率X分辨率(单位应该是若干个字节)视频封装格式
:一种储存视频信息的容器,流式封装可以有TS、FLV等,索引式的封装有MP4,MOV,AVI等,- 主要作用:一个视频文件往往会包含图像和音频,还有一些配置信息(如图像和音频的关联,如何解码它们等):这些内容需要按照一定的规则组织、封装起来.
- 注意:会发现封装格式跟文件格式一样,因为一般视频文件格式的后缀名即采用相应的视频封装格式的名称,所以视频文件格式就是视频封装格式。
编码方式
- 硬编码: 使用如显卡 GPU、专用的DSP芯片等进行编码
- 软编码: 使用 CPU 进行编码,手机易发热
编码标准
- 视频编码: H.265、H264、VP8、VP9等
- 音频编码: AAC、Opus
未压缩的视频数据有多大?
时长
: 1分钟,分辨率
: 1280*720帧率
:16帧 的视频大小: 1280 x 720 x 16(帧) x 60(秒) / 1024 / 1024 = 843.75M
为什么视频可以进行压缩编码?
- 存在冗余信息
- 空间冗余: 图像相邻像素之间较强的相关性。是指同一张图像中,有很多像素点表示的信息是一样的, 比如一张纯白的图片,如果对每一个像素进行单独的存储,会浪费空间
- 时间冗余: 视频序列的相邻图像之间的内容相似。是指队长图片之间,有非常多的相关性
- 视觉冗余: 人的视觉系统对某些细节不敏感。人的视觉系统对高频信息不敏感(
丢弃高频信息,只编码低频信息
)、对高对比度更敏感(提高边缘信息的主观质量
)、对亮度信息比色度信息更敏感(降低色度的解析度
)、对运动的信息更敏感(对 ROI进行特殊处理
)
压缩编码的标准
- H.26X系列(由
ITU国际电信联盟
主导)- H.261: 主要在老的视频会议和视频电话产品中使用
- H.263: 主要在视频会议、视频电话和网络视频上使用
- H.264: H.264/MPEG-4第十部分,或称AVC(Advanced Video Coding),是一种视频压缩标准,一种被广泛使用的高精度视频的录制、压缩和发布格式。
- H.265: 目前发展的趋势,还不够成熟,尚未有大众化编码软件出现
- MPEG(由 ISO下属MPEG开发)
- MPEG-1第二部分: 主要用在 VCD
- MPEG-2第二部分: 等同 H.262
- MPEG-4第二部分: 使用在网络传输、广播和媒体存储上
H.264(目前应用最广泛)
- 在H.264协议中定义了三种帧
I 帧(关键帧)
: 完整编码的帧,保留一副完整的画面,解码时只需要本帧数据就可以完成(因为包含完整画面)P 帧(差别帧)
: 参考之前的 I 帧生成的只包含差异部分编码的帧,保留这一帧跟之前帧的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(P帧没有完整画面数据,只有与前一帧的画面差别的数据)B 帧(双向差别帧)
: 保留的是本帧与前后帧的差别,解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累
- H.264采用的核心算法是
帧内压缩
和帧间压缩
帧内压缩
是生成 I 帧的算法帧间压缩
是生成 B 帧和 P 帧的算法
- H.264的压缩方法
- 分组: 把几帧图像分为一组(GOP, 也就是一个序列),为防止运动变化,帧数不宜取多
- 定义帧: 将每组内各帧图像定义为三种类型,即I 帧、P 帧和 B 帧
- 预测帧: 以 I 帧作为基础帧,以 I 帧预测 P 帧,再有 I 帧和 P 帧预测B 帧。
- 数据传输: 最后将 I 帧数据与预测的差值信息进行存储和传输。
- H.264分层设计
- 分层设计:
- H.264算法在概念上分为两层: 视频编码层(
VCL
: Video Coding Layer)负责高效的视频内容表示; 网络提取层(NAL
: Network Abstraction Layer)负责以网络所要求的恰当的方式对数据进行打包和传递。 - 这样,高效编码和网络友好性分别由
VCL
和NAL
分别完成。
- H.264算法在概念上分为两层: 视频编码层(
NAL
封装方式:NAL
是将每一帧数据写入到一个NAL单元(NALU)中,进行传输和存储的NALU
分为NALU头
和NALU体
NALU头
通常为00 00 00 01
,作为一个新的NALU
的起始标识NALU体
封装着VCL
编码后的信息和其他信息
- 封装过程
- I 帧、P 帧和 B 帧都是被封装成一个或者多个NALU进行传输和存储的
- I 帧开始之前也有非
VCL
的NAL
单元,用于保存其他信息,比如:PPS
、SPS
PPS(Picture Parameter Sets)
: 图像采集集SPS(Sequence Parameter Sets)
: 序列采集集
- 分层设计:
iOS 软编码
软编码主要利用 CPU 进行编码的过程 ,具体一般使用FFmepg 或 x264
- FFmepg
- FFmepg是一个非常强大的音视频处理库,包括
视频采集功能
、``视频格式转换、
视频抓图、
视频加水印`等 - FFmepg在Linux平台下开发,但它同样可以在其他操作系统环境中编译运行
- FFmepg是一个非常强大的音视频处理库,包括
- X264
H.264
是ITU 制定的视频编码标准,而x264是一个开源的H.264/MPEG-4 视频编码函数库,是最好的有损视频编码器,里面集成了很多优秀的视频编码算法。(http:blog.csdn.net/leixiaohua1020
)
四、传输
- 从推流端到服务器
- 数据经过推流端采集和预处理,编码之后推流到服务端
- 流传输涉及到常用的协议有RTMP、RTSP、HLS
- 搭建nginx+rtmp进行推流
五、解码播放
- 拉流获取音视频数据后,需要通过解码器解码,渲染才能在播放器播放。
- 具体步骤:
- 解协议: 取出网络传输过程中的一些无用信息
- 解封装: 获取到的是音频&视频放在一起的封装文件
- 音视频解码: 音视频都是经过压缩编码的内容,解码后才能进行播放
- 音视频同步: 视频&音频需要同步播放
- 音视频播放: 声卡&显卡等对音视频进行播放