type
status
date
slug
summary
tags
category
icon
password
音视频开发是一个比较泛的课题,涉及的知识面很多,这里针对Android开发的程序员制定一个音视频入门的学习路线,涉及音视频基础概念、基础知识、各种应用场景等。
基础
我们先来回忆下前端面试的经典题目:从输入URL到页面展示的过程中发生了什么?。首先,浏览器会解析URL,确定要访问的服务器和资源。然后,浏览器会发送HTTP请求到服务器,请求服务器返回网页的数据。服务器接收到请求后,会处理请求并返回响应。浏览器接收到响应后,会开始解析HTML,构建DOM树,并加载CSS和JavaScript。接下来,浏览器会根据DOM树和CSS样式进行渲染,将网页展示给用户。
类比到音视频领域中,我们可以提出类似的问题:从相机录制到编码成视频的过程发生了什么,牵扯到哪些概念?。首先,相机会捕捉到视频的原始数据。然后,这些数据会经过编码器进行压缩,以减少文件大小和传输带宽。编码器使用不同的算法和标准来将视频数据转换为特定格式。接下来,编码后的视频可以通过网络传输或存储在设备中。当用户想要播放视频时,视频会经过解码器进行解码,还原为原始的视频数据。最后,这些数据经过渲染和显示,最终展示给用户观看。
在音视频开发中,还涉及许多其他的概念和技术,例如音频编码、流媒体、媒体容器格式等等。由于涉及的技术面很广,对应的概念也很多,一次学习囊括所有概念可能有些困难。因此,我们可以先学习一些最基础、最普遍的概念,对于遇到的其他概念,可以在后续的学习中逐渐了解。
1. 图像
色域: 了解图像处理中的sRGB和P3色域,它们分别有什么应用?
色彩空间: 学习RGB和YUV等常用色彩空间,以及它们之间的转换方式。
2. 相机操作相关
相机基础: 相机光圈、ISO参数、测光模式、对焦模式、焦距、曝光补偿等基本概念如何影响摄影效果?录制时可以通过Android提供的哪些API调整这些参数?如何调整?
相机数据: YUV格式、NV12、YUV420等相机数据格式如何影响图像和视频处理?
3. 相机数据
YUV格式: YUV格式、NV12、YUV420等相机数据格式的选择标准是什么?
相机曲线: 相机曲线中的Gamma曲线如何影响图像处理?为何要了解它?
HDR视频: 了解HDR视频的HLG、PQ曲线以及Tone Mapping的原理和应用场景。
4. 视频
为什么要编码: 为何在视频处理中需要进行编码?
编码格式: 视频编码格式、码流格式、封包格式之间的关系是什么?
视频参数: 分辨率、比特率、帧率在视频中的调节会有什么影响?
帧类型: I帧、B帧、P帧、IDR帧在视频传输中的作用分别是什么?
H.264编码: H.264编码中的GOP、静态码率和动态码率、AVC和Annex-b码流格式有何特点?
5. 音频
声音基础: 什么是声音,以及声波的三要素(频率、振幅和波形)是如何影响音频体验的?
采样流程: 了解声音采样的基本流程以及奈奎斯特采样定理的应用。(采样涉及到的概念:采样率、采样位数、声道数、比特率(码率))
编码格式: 不同音频编码格式(如PCM、WAV、MP3、Ogg、WMA、APE、FLAC、AAC)适用于哪些场景?
AAC编码: 深入了解AAC编码中的ADTS和ADIF文件格式信息的作用是什么?
6. 封装
封装格式: 各种视频文件封装格式(如mp4、rmvb、mkv、avi)的特点和应用场景是什么?
mp4封装: mp4中的ftyp、moov、ctts等BOX概念具体表示什么?
格式排查: 使用工具排查和解决视频格式问题的具体步骤是什么?
实践
在音视频开发中,以业务为导向进行学习是很有效的学习方式。例如,如果你想学习视频录制和编辑、播放器、直播推拉流、音视频通话等领域,那么你可以先设定一个具体的业务场景,然后围绕这个业务去掌握一系列相关的技能,尝试使用不同的方案,选择最优的解决方案。
举个例子,以做播放器为目标,你可以先学习如何使用MediaExtractor进行解封装,使用MediaCodec进行解码,使用OpenGL进行渲染等。通过掌握这些基础技能,你可以完成第一版的播放器开发。然后,你可以尝试用不同的技术方案替换其中的某个环节,比较新旧方案的效率,看看哪个更优。
通过这种以业务为导向的学习方式,你可以更加有针对性地学习和掌握技能,而不会因为新技术的出现而感到手忙脚乱。此外,在学习过程中,你也会逐渐了解到更多与音视频开发相关的概念和技术,例如音频编码、流媒体、媒体容器格式等等。
因为音视频开发涉及的技术面很广,所以一次性学习所有概念可能会有些困难。因此,建议你先学习一些最基础、最普遍的概念,然后在后续的学习中逐渐了解其他概念。这样,你可以更好地掌握和应用音视频开发中的各种技术和概念。
下面列举了一些常见的业务场景,可以围绕这些业务以做小项目的形式去自己摸索,给出自己的方案,并总结经验。
1. 视频录制(编码)
掌握不同方式的视频录制,包括录制不同格式的视频,并结合不同场景应用。
使用Android相机API实现基本的视频录制功能,实现将录制的视频保存为文件。
理解和调整相机参数,如分辨率、帧率等。
使用MediaRecorder录制常见的视频格式,如MP4、3GP,了解不同格式的特点和适用场景。
2. 视频文件播放器(解码)
构建一个基本的视频文件播放器,能够解封装、解码并渲染视频。
硬解
学习MediaExtractor的使用,实现从视频文件中提取音视频数据。
使用MediaCodec解码音视频数据。
处理音视频同步和渲染问题。
软解
学习FFmpeg库,了解其在音视频处理中的作用。
实现使用FFmpeg解封装、解码和渲染视频。
OpenGL渲染
集成OpenGL,实现视频的硬件加速渲染。
优化渲染性能,实现视频流畅播放。
3. 直播推拉流(协议、传输)
了解并掌握直播推拉流的基本原理和操作。
直播协议
了解直播协议,如RTMP、HLS等的基本原理。
推流
使用推流SDK,实现手机端推流到服务器。
处理推流中的常见问题,如丢帧、码率控制等。
拉流
使用拉流SDK,实现从服务器拉取直播流。
处理拉流中的网络波动、延迟等问题。
4. 音视频通话(综合应用)
学习WebRTC技术,实现实时音视频通话功能。
了解WebRTC的基本原理和架构。
使用WebRTC API,实现手机端的音视频通话功能,处理通话中的网络适应、丢包等问题。
- 作者:miracleshed
- 链接:http://miracleshed.site/article/049753d8-646d-4138-a5d4-576da4c7c794
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。