音视频技术学习方法
1、视频播放器原理
视频播放器播放互联网上的视频需要经过以下几个步骤:解协议,解放装,解码视音频,视音频同步。如果播放本地视频则不需要解协议。如下为过程示意图。
解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。
视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
2、重要知识点
2.1 知识点
知识点 | 重要度 | 作用 |
---|---|---|
YUV/RGB | ★★★★★ | 视频原始(裸流)数据,解码最终显示就是一帧帧YUV数据 。 |
PCM | ★★★★★ | 音频原始(裸流)数据,解码最终播放的就是PCM数据。 |
H.264(AVC) | ★★★★★ | 目前主流的视频编解码协议。 |
H.265(HEVC) | ★★★☆☆ | 基于H.264的升级版,大幅度提升了编码大小和质量。因为版权和收费问题没有普及。 |
AAC | ★★★★★ | 目前主流的音频编解码协议。 |
RTMP | ★★★☆☆ | 直播推流,看侧重点 |
封装格式 | ★★☆☆☆ | MP4、AVI、MKV、RMVB、FLV等容器,把音频、视频、字幕等通道封装成一个文件 |
webrtc(VP8) | ★★★☆☆ | P2P的音视频通话,看侧重点 |
OpenGL | ★★★☆☆ | 使用GPU渲染视频,释放宝贵的CPU资源,看侧重点 |
2.2 学习路线
这里不推荐直接学习雷神的 FFMPEG视音频编解码零基础学习方法,建议是通过在学习FFmpeg官方例子中进行学习,避免先入为主使用了过时的API。
- 源码编译
- 源码阅读
- 学习官方例子
- 音视频同步
- FFmpeg相关
2.3 OpenGL
OpenGL 使用 GPU 渲染视频,释放宝贵的CPU资源,学习它是必不可少的。但是,正如雷神所说:作为一个搞视频技术的人研究 OpenGL ,需要耗费大量时间和精力,这样学习不是很经济。所以推荐只学习有关视频渲染相关知识。
- OpenGL介绍,和相关程序库
- 纹理有关的基础知识 、OpenGL播放RGB/YUV 、OpenGL播放YUV420P(通过Texture,使用Shader)
- Android OpenGL ES官方文档
- LearnOpenGL-CN
- OpenGL电子书下载
- OpenGL基础知识
- GLSL(着色器语言)中文手册
- Android OpenGL ES 3.0 从入门到精通系统性学习教程
3、流媒体协议
流媒体协议是服务器与客户端之间通信遵循的规定。当前网络上主要的流媒体协议如表所示。
流媒体协议 | 推出机构 | 传输层协议 | 客户端 | 使用领域 |
---|---|---|---|---|
RTMP | Adobe | TCP | Adobe Flash Player, VLC, OBS | 直播流媒体传输,尤其是向流媒体平台传输直播数据 |
HLS | Apple | HTTP | Safari, VLC, QuickTime | 视频点播 (VOD)、直播,广泛应用于 Apple 设备 |
DASH | MPEG | HTTP | Chrome, VLC, YouTube, Netflix | 视频点播和直播,广泛应用于跨平台的视频传输 |
SRT | SRT Alliance | UDP | OBS, VLC, Haivision Play | 低延迟视频传输,主要用于不稳定网络环境中的直播传输 |
RTP+RTSP | IETF | UDP, TCP | VLC, QuickTime, FFmpeg | 低延迟流媒体传输,多用于实时传输,如监控和直播 |
WebRTC | W3C +IETF | UDP, TCP | Chrome, Firefox, Safari | 实时通信,广泛应用于视频会议和直播等低延迟场景 |
MMS | Microsoft | TCP, UDP | Windows Media Player | 曾广泛用于 Microsoft 媒体流传输,逐步被其他协议取代 |
HTTP Progressive | 无专门机构 | HTTP | 浏览器、媒体播放器 | 点播视频传输,常用于早期流媒体网站 |
在当前流媒体传输中,以下协议较为常用,适合不同的使用场景:
- HLS (HTTP Live Streaming)
- 应用广泛:支持点播和直播流媒体,尤其适用于苹果设备。
- 兼容性强:HLS 在移动设备和 Web 浏览器中有良好的兼容性,且可以自动调整视频质量。
- 主要使用场景:广泛用于在线视频平台、直播网站和视频点播 (VOD) 服务,如 Apple TV、YouTube 等。
- DASH (Dynamic Adaptive Streaming over HTTP)
- 跨平台支持:与 HLS 类似,但具有更高的跨平台兼容性(特别是 Android 和 Chrome 支持较好)。
- 自适应码率:支持动态调整码率,以适应用户网络状况。
- 主要使用场景:YouTube、Netflix 等主流视频点播和直播服务。
- RTMP (Real-Time Messaging Protocol)
- 直播传输:RTMP 低延迟,曾是视频直播和流媒体传输的标准协议。
- 推流:常用于直播推流到流媒体平台,如 OBS 推流到 YouTube、Twitch。
- 主要使用场景:广泛用于直播平台的推流部分,尤其是主播推流。
- SRT (Secure Reliable Transport)
- 可靠性高:SRT 是新兴协议,专为不稳定网络环境下的低延迟、高质量直播传输设计。
- 低延迟:在内容分发网络 (CDN) 和远程制作中使用,适合远距离的稳定直播。
- 主要使用场景:新闻直播、体育直播、远程视频制作等。
- WebRTC
- 实时交互:提供超低延迟,特别适合实时视频通话、视频会议、直播互动等。
- 浏览器支持:支持在浏览器上直接运行,兼容 Chrome、Firefox、Safari 等。
- 主要使用场景:视频会议、互动直播、在线教育、游戏直播等。
- RTP/RTSP (Real-time Transport Protocol / Real-Time Streaming Protocol)
- 实时性强:支持音视频实时传输,通常配合 UDP,延迟低。
- 主要使用场景:广泛应用于安防监控、视频会议和专业广播中。
4、封装格式
封装格式的主要作用是把视频码流和音频码流按照一定的格式存储在一个文件中。现如今流行的封装格式如下表所示:
封装格式 | 推出机构 | 流媒体 | 支持的视频编码 | 支持的音频编码 | 目前使用领域 |
---|---|---|---|---|---|
MP4 | MPEG | 支持 | H.264, H.265 (HEVC) | AAC, MP3 | 点播视频、在线视频平台(如 YouTube) |
MKV | Matroska | 支持 | H.264, H.265, VP9 | AAC, Vorbis, Opus, MP3 | 高清视频、电影分发、P2P 传输 |
MOV | Apple | 支持 | H.264, H.265, ProRes | AAC, ALAC | 视频编辑、Apple 生态(如 QuickTime) |
AVI | Microsoft | 不常用于流媒体 | 多种格式 (MPEG-4, DivX) | MP3, PCM | 桌面媒体文件存储,较少用于流媒体 |
FLV | Adobe | 支持 | H.264, VP6 | MP3, AAC | 网络视频传输(已逐渐被其他格式替代) |
TS | MPEG | 支持 | H.264, H.265 | AAC, MP2 | 数字电视广播、直播流(HLS 使用 TS 片段) |
MPEG-2 PS | MPEG | 不常用于流媒体 | MPEG-2 | MP3, AC-3 | DVD 视频、早期数字电视 |
WEBM | 支持 | VP8, VP9 | Opus, Vorbis | HTML5 视频、Web 流媒体(如 YouTube) | |
ASF | Microsoft | 支持 | WMV | WMA | Windows 流媒体,较少用于现代流媒体 |
OGG | Xiph.Org | 支持 | Theora, VP8 | Vorbis, Opus | 开源视频平台、在线音频流媒体 |
5、视频编码
视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。如果视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。视频编码是视音频技术中最重要的技术之一。视频码流的数据量占了视音频总数据量的绝大部分。高效率的视频编码在同等的码率下,可以获得更高的视频质量。
注:视频编码技术在整个视音频技术中应该是最复杂的技术。
视频编码 | 推出机构 | 推出时间 | 普及情况 |
---|---|---|---|
H.264 | ITU-T (国际电信联盟) 和 MPEG | 2003 | 普及率极高,广泛用于流媒体、视频会议、电视广播等 |
H.265 (HEVC) | ITU-T 和 MPEG | 2013 | 普及率高,逐渐取代 H.264,应用于 4K 视频、流媒体等 |
VP8 | 2008 | 应用较少,主要用于 Web 视频(如 WebM),尤其在开源项目中 | |
VP9 | 2013 | 普及率中等,用于 Web 流媒体,特别是 YouTube 等平台 | |
AV1 | AOMedia (Alliance for Open Media) | 2018 | 逐步普及,因其开放性和高压缩效率被 Netflix、YouTube 等采用 |
MPEG-2 | MPEG | 1995 | 较低普及率,主要用于早期 DVD 和数字电视,现在逐渐被替代 |
ProRes | Apple | 2007 | 专业视频制作中使用,常用于影视制作和后期剪辑 |
WMV (Windows Media Video) | Microsoft | 1999 | 较低普及率,主要在 Windows 平台和早期网络视频中应用 |
CineForm | GoPro | 2001 | 用于视频编辑和高质量视频制作,较少用于普通流媒体 |
5.1 主流编码标准
H.264仅仅是一个编码标准,而不是一个具体的编码器,H.264只是给编码器的实现提供参照用的。
基于H.264标准的编码器有很多。
编码器 | 开发机构 | 特点 | 应用领域 |
---|---|---|---|
x264 | VideoLAN | 开源,压缩效率高,支持多种 H.264 配置 | 流媒体、视频编辑、视频直播 |
Intel Quick Sync Video (QSV) | Intel | 利用 Intel CPU 内置的 GPU 进行硬件加速,速度快 | 实时视频编码,低延迟应用 |
NVIDIA NVENC | NVIDIA | 利用 NVIDIA GPU 进行硬件加速,支持高效实时编码 | 视频直播、游戏录制、实时流媒体 |
AMD VCE (Video Coding Engine) | AMD | 利用 AMD GPU 加速 H.264 编码 | 视频直播、游戏录制 |
OpenH264 | Cisco | 开源编码器,轻量且兼容性好,易于集成 | 实时通信(WebRTC)、视频会议应用 |
Apple VideoToolbox | Apple | Apple 的硬件加速编码器,适用于 Apple 设备 | macOS 和 iOS 平台的视频应用 |
FFmpeg H.264 (libx264) | FFmpeg | 基于 x264 的编码实现,支持多种配置和参数调整 | 各类视频处理应用,包括转码、压缩 |
MainConcept H.264 | MainConcept | 商业编码器,提供高质量、稳定性高的编码服务 | 广播级别视频处理、专业视频制作 |
Turing Encoder | NVIDIA | 针对 Turing 架构的 NVIDIA GPU 优化的编码器 | 高质量流媒体、游戏录制,主要用于 NVIDIA 新款显卡 |
x264 和 FFmpeg 的 libx264 是最常用的开源软件编码器,适合大多数 H.264 编码场景。
NVIDIA NVENC、Intel QSV 和 AMD VCE 是硬件加速编码器,适合实时应用,如游戏录制和直播。
OpenH264 和 Apple VideoToolbox 常用于实时通信和 Apple 设备。
MainConcept 和 Turing Encoder 则多用于专业和高端视频应用场景。
5.2 学习方法
- 理解视频编码的基本概念
- 视频编码:学习视频压缩的基本原理,包括什么是编码和解码,以及视频编码的目的——减少视频数据的体积,同时保留视频质量。
- 关键术语:掌握一些常用术语,如比特率(bitrate)、帧率(frame rate)、分辨率(resolution)、GOP(Group of Pictures)等。
- 了解视频编码标准:H.264、H.265、VP9、AV1 等主流编码标准的差异及其应用场景。
- 了解常见视频编码标准
- H.264:最广泛使用的编码标准,适用于流媒体、视频会议等。了解 H.264 的基本架构及压缩原理,如 I 帧、P 帧、B 帧。
- H.265(HEVC):相比 H.264 提供更高的压缩效率,适合高清和 4K 视频。可以学习 H.265 相较 H.264 的优化之处。
- VP8 / VP9 / AV1:由 Google 和 AOMedia 推出的开源标准,主要用于 Web 视频。VP9 和 AV1 的应用逐渐增加,可学习其对 H.265 的替代性。
- MPEG-2:较早的编码标准,现在主要用于 DVD 和部分电视广播,学习其历史和在特定领域的应用即可。
- 学习常用的编码器
- x264 和 x265:了解开源编码器 x264 和 x265,分别是 H.264 和 H.265 的参考实现。
- FFmpeg:掌握 FFmpeg 的基本使用,FFmpeg 支持多种视频格式和编码器,可用于视频处理、转码等。
- 硬件加速编码器:如 Intel QSV、NVIDIA NVENC、AMD VCE,了解硬件加速在实时编码和低延迟应用中的优势。
- 实践基础:使用 FFmpeg 进行视频编码
- 安装 FFmpeg:安装 FFmpeg 并熟悉命令行。
- 基本命令:学习 FFmpeg 的基本命令,例如读取视频、设置分辨率、帧率、比特率等。
- 编码参数优化:学习如何调整编码参数以平衡质量和压缩效率,如
-preset
、-crf
(恒定质量因子)等参数。 - 音频处理:了解如何处理音频流,包括音频编码(如 AAC、MP3)和音视频同步。
- 深入学习视频压缩原理
- 预测编码:学习帧间和帧内预测的工作原理,如何利用前后帧数据进行压缩。
- 运动估计:了解运动补偿原理,如何通过块匹配进行运动估计,以减少冗余数据。
- 变换编码:学习离散余弦变换(DCT)等基本算法,理解其在视频压缩中的作用。
- 熵编码:掌握如 CABAC(上下文自适应二进制算术编码)等熵编码技术在 H.264 和 H.265 中的应用。
- 进阶:硬件编码与实时编码优化
- 硬件编码加速:学习如何利用 NVIDIA NVENC、Intel QSV 等 GPU 加速器进行编码,特别适合实时直播和录制。
- 低延迟编码:了解低延迟编码的需求和配置方法,如用于视频会议和在线直播的优化参数。
- 编码器预设与配置:深入学习编码器的不同预设和调优方法,以获得最佳的画质和压缩率平衡。
- 学习视频容器格式及流媒体协议
- 容器格式:掌握常用的容器格式,如 MP4、MKV、MOV、TS、FLV,它们如何封装音视频流、字幕和元数据。
- 流媒体协议:学习流媒体传输协议如 HLS、RTMP、DASH,了解它们在实时流媒体和视频点播中的应用。
- 实战:流媒体项目
- 项目实践:尝试完成一个小型视频转码或流媒体项目,应用所学知识。
- 测试与优化:在实际应用中测试不同编码标准的效果,优化视频质量、带宽消耗等。
- 学习资源推荐
- 文档和标准:阅读 H.264 和 H.265 标准文档,了解详细的技术细节。
- FFmpeg 官方文档:FFmpeg 官网提供了详细的命令和参数说明。
- 视频教程和书籍:如《FFmpeg从入门到精通》以及相关的 YouTube 视频教程。
6、音频编码
音频编码的主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。音频编码也是互联网视音频技术中一个重要的技术。但是一般情况下音频的数据量要远小于视频的数据量,因而即使使用稍微落后的音频编码标准,而导致音频数据量有所增加,也不会对视音频的总数据量产生太大的影响。高效率的音频编码在同等的码率下,可以获得更高的音质。
音频编码格式 | 推出机构 | 推出时间 | 普及情况 |
---|---|---|---|
AAC (Advanced Audio Coding) | MPEG | 1997 | 普及率极高,用于流媒体、音乐文件(如 Apple Music、YouTube),质量高,压缩效率好 |
MP3 | Fraunhofer Institute | 1993 | 非常普及,广泛应用于数字音乐文件和音频流媒体,但逐渐被 AAC 取代 |
Opus | Xiph.Org Foundation | 2012 | 普及率较高,开源且支持低延迟,常用于 WebRTC 和实时流媒体 |
WMA (Windows Media Audio) | Microsoft | 1999 | 使用率较低,主要用于 Windows 平台,现已不常见 |
FLAC (Free Lossless Audio Codec) | Xiph.Org Foundation | 2001 | 在无损音乐存储中较普及,支持无损压缩,常用于高质量音频 |
ALAC (Apple Lossless Audio Codec) | Apple | 2004 | 使用较少,主要在 Apple 生态中用于无损音频 |
PCM (Pulse Code Modulation) | - | 20世纪30年代 | 用于 CD 和专业音频制作,未压缩的音频编码,音质高,但文件大 |
- AAC 和 MP3 是最常用的有损压缩音频编码格式。