音视频学习笔记

前言

自己都是对直播这个模块很好奇,觉得是很深的,一直没有学习的机会,没有再项目中运用到,现在根据自己网上看到的文章

推流:指的是把采集阶段封包好的内容,传输到服务器的过程。

拉流:指服务器已有直播内容,用指定地址进行拉取的过程。

主流的推送协议

RTMP:视频必须是H264编码,音频必须是AAC或MP3编码,且多以flv格式封包。

优点:对CDN支持良好,实现难度较低

缺点:不支持浏览器

HLS:基于HTTP的流媒体实时传输协议。原理是将整个流分为多个小的文件来下载,每次只下载若干个。服务器端会将数据生成新的小文件,客户端只要不停的按顺序获取到的文件,从而达到直播的效果。HLS是以点播的技术实现了直播的体验。

传输内容包括两部分:一是M3U8描述文件,二是TS媒体文件。

优点:不用考虑防火墙或者代理的问题,而且分段文件的时长很短。

缺点:延迟一般会高于普通的流媒体直播协议。

WebRTC:WebRTC是一个支持浏览器进行实时语音、视频对话的开源协议。本人只做移动端的,不做深入了解。有兴趣的同学自信百度

RTMP和HLS对比

RTMP:延迟低,基于TCP的长链接,数据处理及时,使用场景:即时互动。

HLS :延迟高,短链接,原理是集合了一段时间的视频数据,切割ts片,逐个下载播放。优点是跨平台。

编码和解码

编码:压缩无用信息和不重要的信息的“压缩处理”,这就叫“编码”。

解码:还原为原始的信号(比如视频中某个点的颜色等),这就是“解码”

软编解码:使用CPU进行编解码,大多使用FFmpeg来编码和解压音视频数据;

硬编解码:主要使用非CPU进行编解码,如GPU等。在使用中,大多直接调用系统API进行音视频编解码处理。使用VideoToolbox中的VTCompressionSessionRef实现

FLV

flv是一种简单的视频合成格式。它支持指定的音视频格式,如:h263,h264,VP6 及 AAC,MP3,Nellymoser等。  

flv刚好支持 h264 和 aac。

rtmp协议所传输的视频流,就要求是flv格式。

视频数据采集原理(推流)

1、音视频的采集

2、对视频进行 H264 编码,对音频进行 AAC 编码

3、对编码后的音、视频数据进行组装封包

4、建立 RTMP 连接并上推到服务端

视频播放原理(拉流)

解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据

解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。


播放卡顿

造成卡顿的原因有几种情况

推流端网络抖动导致数据无法发送到服务器,造成播放端卡顿;

播放端网络抖动导致数据累积在服务器上拉不下来,造成播放卡顿。

弹幕优化

1.弹幕阴影通过NSAttributeString(富文本)的NSStrokeColorAttributeName属性设置文字的轮廓颜色替换文字阴影。

2.用CALayer替代UIView展示。

3.将内容合成一张图片展现

优化切换前后台带来的累积延时

第一种方案是播放器采用视频同步音频的策略,然后退到后台时保持音频继续播放(在 iOS 平台需要开启 App 的 Background Audio 能力来配合)。这样可以保持音频一直播放不产生延时,而当回到前台时,视频同步音频直接切换到最新时间戳即可。

第二种方案是回到前台时重新刷新直播,重连直播流,这样即可消灭累积延时。但是这种方案的问题是重连直播流的过程需要一定的时间,这样回到前台时会有卡顿,或者出现黑屏,尤其是当你的首屏加载优化不够时,这个卡顿或黑屏时间会较长。所以这种方案在你的首屏加载优化的比较好的情况下可以采用。此外,你可以退到后台时截取视频当前帧贴图到直播间上,从而当切回前台时,防止黑屏,优化体验,实践效果还是不错的。

参考

https://www.foolishtalk.org/2019/03/05/音视频学习笔记/

你可能感兴趣的:(音视频学习笔记)