直播App开发

308 阅读11分钟

直播

直播app原理

直播原理:

直播app的原理是将手机采集的音视频流实时传输到服务器上,并通过服务器将视频流传输给观众端。

1.  推流端(采集、美颜处理、编码、推流)

2.  服务端处理(转码、录制、截图、鉴黄)

3.  播放器(拉流、解码、渲染)

直播app实现流程

完整直播app架构

直播app技术点

流媒体

1.  流媒体开发:网络层(socket或st)负责传输,协议层(rtmp或hls)负责网络打包,封装层(flv、ts)负责编解码数据的封装,编码层(h.264和aac)负责图像,音频压缩。

2.  帧:每帧代表一幅静止的图像

3.  GOP:(Group of Pictures)画面组,一个GOP就是一组连续的画面,每个画面都是一帧,一个GOP就是很多帧的集合

4.  码率指的是单位时间内传输的数据量,通常以比特率(bps)或兆比特率(Mbps)来表示。在视频编码中,码率越高,视频的清晰度就越高,但同时也会导致视频文件大小变大。码率的大小取决于视频的分辨率、编码格式、压缩算法等因素。

5.  帧率指的是每秒钟播放的视频帧数,通常以“fps”(frames per second)为单位表示。视频的帧率越高,视频播放的流畅度就越高,但同时也会导致视频文件大小变大。常见的视频帧率有25fps、30fps和60fps等。

6.  分辨率:(矩形)图片的长度和宽度,即图片的尺寸

7.  压缩前的每秒数据量:帧率X分辨率(单位应该是若干个字节)

8.  压缩比:压缩前的每秒数据量/码率 (对于同一个视频源并采用同一种视频编码算法,则压缩比越高,画面质量越差。)

直播基础知识

采集视频、音频

采集视频、音频编码框架

1.  AVFoundation:AVFoundation是用来播放和创建实时的视听媒体数据的框架,同时提供Objective-C接口来操作这些视听数据,比如编辑,旋转,重编码

视频、音频硬件设备

1.  CCD:图像传感器: 用于图像采集和处理的过程,把图像转换成电信号。

2.  拾音器:声音传感器: 用于声音采集和处理的过程,把声音转换成电信号。

3.  音频采样数据:一般都是PCM格式

4.  视频采样数据::一般都是YUV,或RGB格式,采集到的原始音视频的体积是非常大的,需要经过压缩技术处理来提高传输效率

视频处理(美颜,水印)

视频处理原理

1.  因为视频最终也是通过GPU,一帧一帧渲染到屏幕上的,所以我们可以利用OpenGL ES,对视频帧进行各种加工,从而视频各种不同的效果,就好像一个水龙头流出的水,经过若干节管道,然后流向不同的目标。

2.  现在的各种美颜和视频添加特效的app都是利用GPUImage这个框架实现的。

视频处理框架

1.  GPUImage是一个基于OpenGL ES的一个强大的图像/视频处理框架,封装好了各种滤镜同时也可以编写自定义的滤镜,其本身内置了多达120多种常见的滤镜效果。

2.  OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。

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

视频编码解码

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

-Libswresample:可以对音频进行重采样,rematrixing 以及转换采样格式等操作;
-Libavcodec:提供了一个通用的编解码框架,包含了许多视频、音频和字幕流等编码/解码器;
-Libavformat:用于对视频进行封装/解封装;
-Libavutil:包含一些共用的函数,如随机数生成、数据结构和数学运算等;
-Libpostproc:用于进行视频的一些后期处理;
-Libswscale:用于视频图像缩放,颜色空间转换等;
-Libavfilter:提供滤镜功能。

2.  X264:把视频原数据YUV编码压缩成H.264格式。

3.  VideoToolbox:苹果自带的视频硬解码和硬编码API,但是在iOS8之后才开放。

4.  AudioToolbox:苹果自带的音频硬解码和硬编码API。

视频编码技术

1.  H.264/AVC:H.264/AVC 采用了多种压缩技术,包括帧内压缩和帧间压缩。帧内压缩采用了预测编码技术,即根据已经编码的帧来预测当前帧的像素值,从而减少冗余数据。帧间压缩则采用了运动估计和运动补偿技术,即根据前一帧或后一帧的像素值来预测当前帧的像素值,从而进一步减少冗余数据。

2.  H.265/HEVC:H.265/HEVC 同样采用了帧内压缩和帧间压缩技术,但与 H.264/AVC 不同的是,它使用了更复杂的预测编码算法和更高效的运动估计技术,从而进一步减少冗余数据,提高压缩效率。

音频编码技术

1.  MPEG Audio Layer-3 (MP3):MP3 是一种流行的音频编码技术,它采用了人耳听觉模型的原理,通过去除人耳无法感知的音频信号的高频内容来减小文件大小。MP3 还采用了熵编码等技术来进一步压缩数据。

2.  Advanced Audio Coding (AAC):AAC 是一种高效的音频编码技术,它采用了更先进的压缩算法和更高效的熵编码技术,从而比 MP3 更高效地压缩音频数据。

3.  Free Lossless Audio Codec (FLAC):FLAC 是一种无损音频编码技术,它可以将音频信号完全无损地压缩成较小的文件大小,而不会损失任何音频质量。

4.  Waveform Audio File Format (WAV):WAV 是一种无压缩的音频编码技术,它可以保存原始的音频信号,因此文件大小比较大,但不会损失任何音频质量。

5.  Opus:Opus 是一种免费开源的音频编码技术,它可以对不同类型的音频信号进行优化,从而提供更高效的压缩率和更好的音频质量。

码率控制

1.  恒定码率(Constant Bitrate, CBR):恒定码率是一种固定码率的控制方式,每秒传输的比特率保持不变。这种控制方式适用于对数据传输速率要求比较严格的场景,例如实时视频传输和视频会议等。

2.  可变码率(Variable Bitrate, VBR):可变码率是一种动态码率的控制方式,每秒传输的比特率可以根据数据的复杂度进行调整。这种控制方式适用于需要平衡传输质量和文件大小的场景,例如网络视频和音频文件等。

3.  恒定质量(Constant Quality, CQ):恒定质量是一种根据视频或音频质量来控制码率的方式,每秒传输的比特率可以根据数据的复杂度和质量需求进行调整。这种控制方式适用于需要保持一定质量水平的场景,例如在线视频和流媒体等。

视频封装格式

1.  MP4:MP4 是一种广泛使用的视频封装格式,它可以封装 H.264/AVC、H.265/HEVC、AAC 等多种视频和音频编码格式,并支持字幕、章节、元数据等多种附加信息。

2.  AVI:AVI 是一种早期的视频封装格式,它可以封装多种视频和音频编码格式,但不支持字幕和元数据等附加信息。

3.  MKV:MKV 是一种免费开源的视频封装格式,它可以封装多种视频和音频编码格式,支持字幕、章节、元数据等多种附加信息,并支持高级的视频特效和交互式菜单等功能。

4.  MOV:MOV 是苹果公司开发的视频封装格式,它可以封装多种视频和音频编码格式,并支持字幕、元数据等多种附加信息,但在 Windows 平台上支持不如 MP4 和 AVI 稳定。

5.  FLV:FLV 是一种广泛用于网络视频传输的封装格式,它可以封装 H.264/AVC、AAC 等多种视频和音频编码格式,并支持字幕、元数据等附加信息,同时具有较好的传输性能和兼容性。

推流

1.  推流是指将音视频数据通过网络上传到服务器,以便于实现实时直播、视频会议、远程监控等应用场景。推流技术可以分为两类:直播推流和点播推流。

2.  直播推流是指将实时的音视频数据上传到服务器,实现实时的直播和互动。常见的直播推流协议包括:RTMP、HLS、DASH、WebRTC 等。其中,RTMP 是 Adobe 公司开发的传统直播协议,它可以实现低延迟的直播,但需要安装 Flash 插件;HLS 和 DASH 是苹果公司和 Google 公司开发的 HTTP 直播协议,它们可以实现跨平台的直播,但有一定的延迟;WebRTC 是由 Google 公司开发的一种实时通信协议,它可以实现低延迟的实时音视频通信。

3.  点播推流是指将预先录制好的音视频数据上传到服务器,实现点播和在线播放。常见的点播推流协议包括:HTTP、HLS、DASH 等。其中,HTTP 是最基础的点播协议,通过 HTTP 协议下载视频文件进行播放;HLS 和 DASH 则是基于 HTTP 的流媒体协议,它们可以实现自适应码率和多码率切换等功能,提供更好的用户体验。

推流库

1.  librtmp:librtmp 是一个开源的 C/C++ 库,用于实现 RTMP 协议的推流和拉流功能。RTMP(Real Time Messaging Protocol)是一种 Adobe 公司开发的实时流媒体传输协议,常用于实现直播、视频会议、远程监控等应用场景。

2.  libavformat:libavformat 是 FFmpeg 开源项目的一部分,可以实现音视频封装、解封装、推流、拉流等多种功能。libavformat 支持多种音视频编码格式和传输协议,具有较好的兼容性和稳定性。

3.  libstreaming:libstreaming 是一个基于 Android 平台的开源推流库,可以实现将音视频数据推送到 RTSP 和 RTMP 服务器。libstreaming 支持 H.264 和 AAC 等常用的编码格式,具有较好的兼容性和稳定性。

4.  LFLiveKit:LFLiveKit 是一个开源的 iOS 平台推流库,可以实现将音视频数据推送到 RTMP 服务器。LFLiveKit 支持 H.264 和 AAC 等常用的编码格式,同时提供了多种推流参数的设置和回调函数的接口。

5.  WebRTC:WebRTC 是由 Google 公司开发的一种实时通信协议,可以实现低延迟的实时音视频通信和推流功能。WebRTC 提供了一系列的 API 接口,可以实现音视频采集、编码、传输、解码等多种功能。

流媒体服务器

拉流

直播协议对比 

直播协议选择

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

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

解码

解封装 

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

音频编码框架

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

解码介绍 

1.  硬解码:用GPU来解码,减少CPU运算

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

缺点:兼容不好

2.  软解码:用CPU来解码

优点:兼容好

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

参考:

1.  原理篇|如何快速地开发一个完整的iOS直播App