音频的基础知识
1. 采样和采样频率
在音频处理中,需通过A/D转换将模拟信号变为数字信号,这个过程称为采样。采样频率即一秒钟内采样的次数。
2. 采样位数/位宽
采样位数(采样精度)表示每个采样值用多少位二进制数(0和1)来表示。位数越多,声音还原越真实。
- 8位:取值范围 -128 ~ 127
- 16位:取值范围 -32768 ~ 32767
3. 声道(channel)
- 单声道(mono):常用于语音。
- 双声道(立体声stereo):左声道和右声道。
- 多声道:环绕立体声。
4. 编解码
音频采样过程也称PCM(脉冲编码调制)编码,采样值即PCM值。未经压缩的PCM数据占用空间很大,例如16kHz采样率、16位采样位数、单声道,一秒数据量为:16/8 * 16000 = 32000字节。
主要压缩标准组织:
- ITU:有线语音压缩标准(g系列:g711/g722/g726/g729等)
- 3GPP:无线语音压缩标准(amr系列:amr-nb/amr-wb),ITU后来吸纳amr-wb形成g722.2
- MPEG:音乐压缩标准(11172-3,13818-3/7,14496-3等)
其他标准:iLBC,OPUS。
编码过程:模拟信号 -> 抽样 -> 量化 -> 编码 -> 数字信号
5. 压缩
任何模拟信号转数字信号都有损,但PCM编码在计算机应用中达到最高保真水平,被约定俗成为无损编码。MP3等格式相对PCM被称为有损音频编码。
6. 码率
码率 = 采样频率 × 采样位数 × 声道个数
示例:44.1kHz采样率、16位、立体声,未压缩码率 = 44.1kHz × 16 × 2 = 1411.2Kbps = 176.4KBps
常见码率范围:
- 800 bps:最低可辨语音(FS-1015)
- 8 kbps:电话质量
- 8-500 kbps:Ogg Vorbis、MPEG1有损音频模式
- 500 kbps–1.4 Mbps:44.1kHz无损音频(FLAC、WavPack、Monkey's Audio)
- 1411.2-2822.4 Kbps:CD数字音频(PCM)
- 5644.8 kbps:SACD(Direct Stream Digital)
7. 常用音频格式
- WAV:音质高,无损,体积大
- AAC:优于mp3,有损,文件更小,性价比高
- AMR:压缩比大,质量较差,多用于人声、通话录音
- mp3:广泛使用,有损,牺牲12KHz-16KHz高音频质量
8. 音频开发的主要应用
- 音频播放器、录音机
- 语音电话
- 音视频监控/直播应用
- 音频编辑/处理软件(KTV音效、变声、铃声转换)
- 蓝牙耳机/音箱
9. 音频开发的具体内容
- 音频采集/播放
- 音频算法处理(去噪、静音检测、回声消除、音效处理、功放/增强、混音/分离等)
- 音频编解码和格式转换
- 音频传输协议开发(SIP、A2DP、AVRCP等)
视频基础知识
视频是一种有结构的数据
- 内容元素:图像、音频、元信息
- 编码格式:Video(H.264,H.265...)、Audio(AAC,HE-AAC...)
- 容器封装:MP4,MOV,FLV,RM,RMVB,AVI等
一个完整的视频文件由图像和音频内容,经视频/音频编码压缩,注明元信息,最后通过容器封装而成。
视频播放流程
色彩空间
- RGB:通过红、绿、蓝三色电子束激发荧光粉发光,相加混色原理。
编解码介绍
视频编码将像素数据(如RGB)压缩为码流,大幅降低数据量。例如,1080P分辨率原始图像约6MB(1920×1080×3),转JPG约200KB,每秒12帧需2.4MB/S带宽。经H.264编码后,带宽降至200-300KB/S。
视频由连续图片构成,编码利用帧间相似性压缩。例如,保存一个完整关键帧(I帧),后续帧只记录与关键帧的差异(P帧、B帧),从而节省空间。
H.264编码介绍
- I帧(关键帧):完整画面
- P帧(前向预测帧):参考前一帧的变化
- B帧(双向内插帧):参考前后帧的变化
通过这种帧间压缩,在图像变化不大的序列中,P/B帧大小仅为完整帧的1/10或更小。
视频的实时传输(直播)
直播是将每一帧数据(Video/Audio/Data Frame)打上时序标签(Timestamp),进行流式传输的过程。发送端采集、编码、封包、推流,经中继分发网络,播放端下载、解码、按时序播放。
流媒体协议
- RTSP:一对多,支持实时数据受控、点播,可选择UDP、多播UDP、TCP等传输通道,常基于RTP。
- RTMP:Adobe开发,基于TCP或HTTP轮询,用于Flash播放器与服务器间实时传输,数据包固定大小,支持多通道。
- HLS:苹果公司基于HTTP的流媒体协议,由M3U8描述文件和TS媒体文件组成。客户端不断下载并播放短时长TS文件,实现直播。延迟通常高于RTMP/RTSP,但可穿透防火墙。
FFmpeg
开源计算机程序,用于记录、转换数字音视频,并转化为流。主要函数库:
- libavutil:工具函数库
- libavcodec:音视频编解码
- libavformat:复用/解复用(封装格式处理)
- libavdevice:输入/输出设备
- libavfilter:滤镜特效
- libswscale:图像缩放、颜色空间/像素格式转换
- libswresample:音频重采样、格式转换、混音
实现直播整体流程
- 推流端:采集、美颜处理、编码、推流
- 服务端处理:转码、录制、截图、鉴黄
- 播放器:拉流、解码、渲染
- 互动系统:聊天室、礼物系统、赞
关于直播的优化
1. 秒开优化
- 播放器拿到第一个关键帧(I帧)后立即显示。
- 服务端支持GOP(关键帧周期)缓存,减少回源时间。GOP体现关键帧周期,如帧率24fps、GOP为2s,则一个GOP有48帧。增加关键帧个数可改善画质,但增加带宽和负载。
2. 马赛克、卡顿
- P帧丢失会导致解码错误,表现为马赛克。
- 为避免此问题,若P帧或I帧丢失,通常本GOP内所有帧不显示,直到下一个I帧到来,期间视频静止。
- 连续丢帧过多会造成严重卡顿。解决根本是减少丢帧。
3. 传输协议优化
- 服务端节点间尽量使用RTMP而非HLS,降低传输延迟。
- 若终端用RTMP,尽量在收流节点转码,减小传输流体积。
- 可用定制UDP协议替代TCP,如google的QIUC协议省去弱网重传延迟,但需做好丢包控制,且CDN支持度有限。
4. 传输网络优化
- 服务端缓存当前GOP,配合播放器优化首开时间。
- 实时监控各环节帧率和码率波动。
- 客户端动态查询最优节点(如5秒一次),准实时下线故障节点。
5. 推流、播放优化
- 调整系统网络buffer大小平衡。
- 播放端缓存控制:为秒开可设0缓存立即解码,但弱网下需一定缓存。可考虑动态buffer策略:开始小缓存或0缓存,根据首片下载耗时调整后续缓存大小,播放中实时监测网络动态调整缓存,平衡首开延迟和稳定性。
- 动态码率策略:根据网络状况动态调整播放码率,带宽不足时降低码率减少延迟。