直播
直播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