这是我参与「第四届青训营」笔记创作活动的第6天。
本笔记内容是第五课的多媒体直播技术。
1 视频的基本元素
下面首先介绍总结视频基本元素的概念。
像素:由一个数字序列表示的图像中的一个最小单位称为像素。
RGB三原色:RGB是表示彩色图像的一个常见方案。用R、G、B 0~255表示红色、绿色和蓝色的强度。其可以表示256x256x256=16777216种色彩。
分辨率:纵横方向的像素数量。
码率/比特率:单位时间内传送bit的数目,单位为bps。
帧:视频或者动画中的每一辐画面。
帧率:每秒传输的帧数。
封装:将已编码、压缩的音频轨与视频轨放在一个容器文件中。
2 FFMpeg工具
ffmpeg:视频处理
ffplay:视频播放
ffprobe:视频分析
3 视频压缩
一个视频文件是经过了编码的,而播放便是将该文件解码或渲染。
视频如果不压缩,文件体积会很大,既占空间又难以传输。
视频的压缩可以分为帧内压缩和帧间压缩。帧内压缩又称为空间压缩,这种压缩方式只考虑该帧本身的数据,一般采取有损压缩算法。因为这种压缩方式并没有考虑到该帧与其它相邻帧的关系,因此也不能做到很好的压缩比。
另一种帧间压缩方式也称作时间压缩,这种压缩方式利用了帧前后的冗余信息,通过比较提高压缩比。
根据帧的预测方式不同,分类如下:
I-frame:Intra-frame 帧内帧 这种预测方式仅帧内预测
P-frame:Predicted Frame 前向预测帧 这种预测方式可以参考前面已经编码过的I-frame和P-frame,既可以帧间预测,也可以帧内预测,因此有更好的压缩比,编解码时需要参考帧。
B-frame:Bi-Directional frame 双向帧 这种预测方式可以同时参考前面和后面已经编码过的I-frame和P-frame,所以也是既可以帧间预测,也可以帧内预测的。也因此,其压缩率是最高的,但是因为其需要对帧缓存操作,有延迟高的缺点。
针对以上特点,可以根据应用场景对压缩率和延时要求,选择合适的帧类型。比如,对实时性高的场景,大部分采用I-frame,甚至全部采用。
不同类型的帧可以组合成Group of Pictures,简称GOP。改变播放进度时,新进度如果和旧进度不在同一个GOP中,要在新的GOP的I帧解码,有的播放场景并不精确控制进度条,从而将进度条操作体现得更流畅一些。
常见的视频编码方式有H264和H265,H264是AVC,H265是HEVC。当然,未来H266也会逐步应用。一般来说,越新的编码方式拥有越高的压缩率,但也需要更高的算力。
4 推拉流协议
首先了解MP4的封装格式,MP4有moov存放元数据,有mvhd记录整体信息,有trak记录轨道,有stbl保存媒体数据的索引和时间信息,还有很多其它信息。
接下来了解FLV封装格式,FLV的格式只有文件头和tag,tag包括音频流、视频流、脚本流三种。
对比两者不难发现,FLV的结构更加简单,因此在推拉流协议中FLV经常出现。
对低延迟要求很高可以使用WebRTC。
实时消息协议(Real-Time Messaging Protocol,RTMP)是一种基于TCP的协议,延迟较低。但其不再更新,并且规范中不支持H265。其使用的特殊端口也有被防火墙阻碍的风险。不支持HTML5。
可以使用HTTP+FLV的方式,利用HTTP协议+FLV格式传输,这种方式延时也较低,并且支持H5。
HTTP Live Streaming(HLS)将一个流分为小的文件,这种方式客户端可以适应不同的带宽,其m3u8元数据中有带宽信息。因此可以做到自适应码率。这种方式也不会受到防火墙的影响。这种方式支持H5。但这种方式的延迟较高。
5 客户端
根据角色的不同,客户端可以分为推流端和拉流端。推流端首先通过摄像头、采集卡等方式完成图像采集,然后如果需要做图像处理,先完成处理,随后编码封装,完成推流。
拉流端拉流后要对视频数据解封装、解码,随后如有需要也可以做图像处理,最后完成渲染。
6 总结
音视频开发是Android开发的一个方向。对于该方向的学习,不能仅仅了解常用框架的使用,对于视频的基础知识、直播的基础原理是必须掌握的,因此本节课中老师着重介绍了相关基础。后续学习中也要注意视频基础的理解。