需要学习的知识点,从大类来分
- MediaCodec
(1)音视频的硬解码
(2)音视频做到同步
(3)mp4文件的封装- FFmpeg
(1)学会编译so库
(2)如何引入so库
MediaCodec和FFmpeg都是用于音视频处理的库,但它们有以下不同点:
- 原理不同:MediaCodec是Android系统提供的API,它使用硬件加速来进行音视频编解码,可以提高音视频处理的效率。而FFmpeg是一个开源的跨平台音视频处理库,它使用软件解码和编码,可以在不同的平台上使用。
- 功能不同:MediaCodec主要用于音视频编解码,可以将音视频数据转换为不同的格式,例如H.264、AAC、MP3等。而FFmpeg可以处理音视频的编解码、转码、封装、解封装、剪辑、拼接、滤镜等操作。
- 接口不同:MediaCodec提供了一套Java和JNI的API,可以在Java和C++中使用。而FFmpeg主要是使用C/C++编写的,可以在C/C++中使用。
- 支持的平台不同:MediaCodec是Android系统提供的API,只能在Android平台上使用。而FFmpeg是一个跨平台的库,可以在多个平台上使用,例如Windows、Linux、iOS等。
总之,MediaCodec和FFmpeg都是用于音视频处理的库,但它们的原理、功能、接口和支持的平台等方面存在一些不同。你可以根据实际需求来选择合适的库。如果你在Android平台上进行音视频处理,可以考虑使用MediaCodec,如果你需要在多个平台上进行音视频处理,可以考虑使用FFmpeg。 --------------------------------------------------------------------来自ChatGPT
MediaCodec是Android原生的音视频处理库,对于Android从业者来说,是绕不开的,其实原理上跟ffmpeg有很多相似之处,所以借助MediaCodec去巩固音视频的基础挺好的。学习的过程也是借鉴他人的文章,此处遇到对于入门来说比较好的一个系列文章, 下面的内容也都是在这个文章基础上逐步扩展积累起来的,其实主要是为了记忆平时的所学。
每个知识点需要不断的阅读,代码跟着敲起来,这样可以了解每个代码片段的作用,跟理论结合起来,效果会更好。
下面再来把基础的音视频理论知识做下说明,下面的系列课程也会基于此进行介绍(可能会有更新,文档也会跟着刷新)
1.音频基础知识
-
音频信号分为模拟信号和数字信号。
- 模拟信号不仅在时间上是连续的,而且在幅度上也是连续的。在时间上“连续”是指在任何一个指定的时间范围里声音信号都有无穷多个幅值;在幅度上“连续”是指幅度的数值为实数。
- 数字信号的时间和幅度都是离散的。
-
声音数字化过程:自然界及物理信号--->采样--->量化--->编码--->压缩-→文件存储/网络传输。
-
采样
- 是指将时间轴上连续的信号每隔一定的时间间隔抽取出一个信号的幅度样本,把连续的模拟量用一个个离散的点表示出来,使其成为时间上离散的脉冲序列。
- 采样需要满足奈奎斯特采样定理 :要从采样信号中无失真地恢复原信号,采样频率应大于2倍信号最高频率。采样频率小于2倍频谱最高频率时,信号的频谱有混叠。采样频率大于2倍频谱最高频率时,信号的频谱无混叠。
-
量化
- 是将采样后离散信号的幅度用二进制数表示出来的过程。
- 量化分为均匀和非均匀两种量化方式。非均匀量化也叫做压扩曲线,对小幅度的信号进行扩张,从而获得性能增益。
-
数据量(字节/秒)=采样频率(Hz)*采样精度(bit)*声道数/ 8编码。
-
编码
- 采样和量化后的信号还不是数字信号,需要把它转换成数字编码脉冲,这一过程称为编码。最简单的编码方式是二进制编码,即将已经量化的信号幅值用二进制数表示,计算机内采用的就是这种编码方式。
- PCM (Pulse Code Modulation),即脉冲编码调制,指模拟音频信号只经过采样、模数转换直接形成的二进制序列,未经过任何编码和压缩处理。
-
压缩
-
音频压缩属于数据压缩的一种,是减小数字音频信号文件大小(数据比率)的过程。
-
比特率(bitrate)也叫码率,表示压缩编码后每秒的音频数据量大小。单位为kbps,这里的k为1000。
-
目前主要有三大技术标准组织制定压缩标准:
- a)ITU,主要制定有线语音的压缩标准(g系列),有g711/g722/g726/g729等。
- b)3GPP,主要制定无线语音的压缩标准(amr系列等),有amr-nb/amr-wb。后来ITU吸纳了amr-wb,形成了g722.2。
- c)MPEG,主要制定音乐的压缩标准,有11172-3,13818-3/7,14496-3等。
-
2.视频基础知识
-
编码格式:
- 一个视频文件本身,通常由音频和视频两部分组成。常见的视频编码格式有Xvid,AVC/H.264,MPEG1,MPEG2 等,常见的音频编码有MP3、AAC等。
-
视频码率(kbps):
- 是指视频文件在单位时间内使用的数据流量,也叫码流率。
- 码率越大,单位时间内取样率越大,数据流精度就越高,视频画面更清晰画质更高。
-
视频帧率(fps):
- 通常说一个视频的25帧,指的就是这个视频帧率,即1秒中会显示25帧;
- 视频帧率影响的是画面流畅感,视频帧率越高,画面越显得流畅。当然视频帧率越高,意味着画面越多,也就相应的,这个视频文件的大小也会随之增加,占用存储空间也就增大了。
-
视频分辨率:
- 分辨率就是我们常说的640x480分辨率、1280x720分辨率、 1920x1080分辨率等。
- 分辨率影响视频图像的大小,与视频图像大小成正比。
-
纵横比:
- 4:3 3:4 1:1 16:9 9:16
-
好的画质是分辨率、帧率和码率三者之间的平衡。
-
颜色空间:
- RGB:RGB 模型是目前常用的一种彩色信息表达方式,它使用红、绿、蓝三原色的亮度来定量表示颜色。
- YUV:YUV是一种颜色空间,Y表示流明,U、V表示色度、浓度,对于图像每一点,Y确定其亮度,UV确认其彩度。
- Y'CbCr:Y'为亮度,Cb、Cr分量代表当前颜色对蓝色和红色的偏移程度。
-
视频编解码:
-
视频编码压缩了什么
- 空间冗余:图像相邻像素之间有较强的相关性
- 时间冗余:视频序列的相邻图像之间内容相似
- 编码冗余:不同像素值出现的概率不同
- 视觉冗余:人的视觉系统对某些细节不敏感
- 知识冗余:规律性的结构可由先验知识和背景知识得到
-
I 帧、P 帧、B 帧的区别在于:
- I 帧(Intra coded frames):I 帧图像采用帧内编码方式,即只利用了单帧图像内的空间相关性,而没有利用时间相关性。也叫关键帧。
- P 帧(Predicted frames):P 帧和 B 帧图像采用帧间编码方式,即同时利用了空间和时间上的相关性。P 帧图像只采用前向时间预测,可以提高压缩效率和图像质量。
- B 帧(Bi-directional predicted frames):B 帧图像采用双向时间预测,可以大大提高压缩倍数。值得注意的是,由于 B 帧图像采用了未来帧作为参考,因此 MPEG-2 编码码流中图像帧的传输顺序和显示顺序是不同的。
-
DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义是告诉播放器在什么时候解码这一帧的数据。
-
PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
-
-
容器:
- 即一个视频封装格式,包含多个视频轨和音频轨,包含各自的编解码,一个视频轨可以对应多个音频轨,同时包含各种元数据。
- mp4文件里通常放的是 H264的编码视频和 AAC 编码的音频
-
视频编解码器:
- H.261: 主要在老的视频会议和视频电话产品中使用
- H.263: 主要用在视频会议、视频电话和网络视频上,用于低于 64 Kbps 的低码率视频传输。
- H.263: 用于低于 64 Kbps 的低码率视频传输。
- H.264/AVC: H.264/AVC/MEPG-10 part 10是MPEG-4标准的一部分(MPEG-4 part10)。H.264能够在低码率情况下提供高质量的视频图像,在较低带宽上提供高质量的图像传输;H.264可以根据不同的环境使用不同的传输和播放速率,并且提供了丰富的错误处理工具,可以很好的控制或消除丢包和误码。
- H.265/HEVC: H.265旨在在有限带宽下传输更高质量的网络视频,与H.264相比,同样的视觉质量的视频只占用一半的空间,仅需原先的一半带宽即可播放相同质量的视频,或者具有相同文件大小和比特率的视频可能看起来更好。**
** - MPEG: 1988 年 ISO/IEC 信息技术联合委员会成立了活动图像专家组(MPEG, Moving Picture Expert Group)。 1991 年公布了 MPEG-1 视频编码标准, 1994 年 11 月,公布了 MPEG-2 标准 。
- MPEG-4: 除了定义视频压缩编码标准外,还强调了多媒体通信的交互性和灵活性。
-
H264压缩:
-
压缩技术
- 帧内预测压缩,解决的是空域数据冗余问题。
- 帧间预测压缩(运动估计与补偿),解决的是时域数据冗徐问题。
- 整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化。
- CABAC压缩。
-
H264功能划分为『NAL』和『VCL』:
- VCL(Video Coding Layer),视频编码层,H264编码/压缩的核心,主要负责将视频数据编码压缩,再切分。
- NAL(Network Abstraction Layer),网络抽象层,负责将VCL的数据组织打包。
-
H264压缩算法细节来看就3步:
- 压缩:预测(帧内预测和帧间预测)-> DCT变化和量化 -> 比特流编码;
- 切分数据,主要为了第三步。这里一点,网上看到的“切片(slice) ”、“宏块(macroblock) ”是在VCL中的概念,一方面提高编码效率和降低误码率、另一方面提高网络传输的灵活性。
- 包装成『NAL』。
-
3.流媒体
-
定义:
- 在网络中使用流式传输技术的连续时基媒体,即在因特网上以数据流的方式实时发布音视频多媒体内容的媒体。
- 用户不必像采用下载方式那样等到整个文件全部下载完毕,而是只需经过几秒甚至几十毫秒的启动延时即可在用户的终端上利用解压设备对压缩的音视频、3D等多媒体文件解压后进行播放和观看。
- 多媒体文件边下载边播放的流式传输方式。
- 流媒体技术是网络技术及音视频技术的有机结合。
-
流媒体传输方式:
- 顺序流传输(下载):顺序下载,在下载文件的同时用户可观看在线媒体,在给定时刻,用户只能观看已下载的那部分,而不能跳到还未下载的前头部分。
- 实时流传输(直播):指保证媒体信号带宽与网络连接配匹,使媒体可被实时观看到。因为实时流式传输总是实时传送,所以特别适合现场事件。
-
流媒体传输协议:
- 在流式传输的实现方案中,一般采用HTTP/TCP来传输控制信息,而用RTP/UDP来传输实时多媒体数据。
4.FFmpeg
-
FFmpeg中的“FF”指的是“Fast Forward”,FFmpeg中的“mpeg”则是“Moving Picture Experts Group(动态图像专家组)”。
- FFmpeg既是一款音视频编解码工具,同时也是一组音视频编解码开发套件。
- FFmpeg提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率转换等;
- FFmpeg框架提供了多种丰富的插件模块,包含封装与解封装的插件、编码与解码的插件等。
-
FFmpeg的组件:
- ffmpeg:超快音视频编码器
- ffplay:简单媒体播放器
- ffprobe:简单多媒体流分析器
-
FFmpeg音视频处理流程:
ffmpeg -i test_1920*1080.mp4 -acodec copy -vcodec libx264 -s 1280*720 test_1280*720.flv
ffmpeg -i test_1920*1080.mp4 -acodec copy -vcodec libx265 -s 1280*720 test_1280*720.flv
- 举例:
- 第一步:demuxer获得编码数据包,也就是AVC编码的视频包和AAC编码的音频报。
- 第二步:decoder解码出数据帧
- 第三步:使用filter对帧进行处理,也就是将分辨率转换为1230*720。
- 第四步:使用encoder和libx264对帧进行编码,获得AVC编码的视频包和AAC编码的音频报。
- 第五步:使用muxer将音频视频文件合在一起,获得.flv文件
-
FFmpeg命令:
- ffmpeg -h:查询ffmpeg 的命令
- ffplay -h:查询ffmpeg 的命令
- ffprobe -h:查询ffprobe 的命令
- 具体查询分类所支持的参数:ffmpeg -h type=name
- ffplay播放控制命令:
-
目前用到的命令:
* ffprobe -i filepath -print\_format json -show\_frames -v quiet:以json格式展示每一帧的信息(包括这一帧的类型)和视频的格式信息。
* ffmpeg -ss 00:00:00 -i input\_file\_h264.mp4 -vcodec copy -acodec copy -t 00:00:01 output\_file.mp4:对视频进行切割,切割6分钟的视频,注意,由于关键帧(I帧)的存在,这种切分可能导致缺少关键帧的视频出现模糊的情况。
* ffmpeg -f concat -i filelist.txt -c copy output.mp4:对视频进行拼接,注意filelist.txt是视频的列表,里面形如file '1.mp4'。
* ffmpeg -r 30 -f image2 -i %d.png -vcodec libx264 output.mp4:把图片拼接成视频,-r是帧率,-i是目录。
* ffmpeg -i test-1.mp4 -c:v libx264 -preset slow -crf 26 -profile:v high -vf scale=1080:-1 test-1\_t.mp4 -y:把视频转码成1080p。
* ffmpeg -i Test.mp4 -vf crop=540:320:0:280out.mp4 -y:裁剪视频,将原视频裁剪成540:320的大小,从原视频0:280的位置开始裁剪。
* ffmpeg -i input.mp4 -vf boxblur=1.5:1 output.mp4:视频加一层模糊,主要是针对有噪点的低画质的视频。
* ffmpeg -i D:\我的文档\11151514\Desktop\25-1.mp4 -vf unsharp=5:5:0.8 D:\我的文档\11151514\Desktop\25-1-unsharp-2.mp4:添加锐化。
* ffmpeg -i yingshi-6.mp4 -vn -codec copy out.m4a:提取视频中的音频。
* ffmpeg -i yingshi-6\_sr.mp4 -i out.m4a -vcodec copy -acodec copy output.mp4:合成音频和视频。
* ffmpeg -i input1.mp4 -i input2.mp4 -filter\_complex "\[0:v]pad=iw\*2:ih\[a];\[a]\[1:v]overlay=w" output.mp4:把两个视频左右拼接成一个视频
* ffmpeg -i input.mp4 -c:v libx264 -crf 35 out.mp4 -y:通过crf值压缩视频(最简单方式)
* ffmpeg -i './workout/df400dc5-default\_sr\_concat.mp4' -vcodec libx265 -vf scale=720:1280 -crf 26 -maxrate 840k -bufsize 1680k -acodec copy -movflags faststart -color\_range tv -colorspace bt709 -color\_trc bt709 -color\_primaries bt709 -chroma\_sample\_location left -max\_muxing\_queue\_size 8192 -preset slow ./workout/SR20221123125602271586783ENCY6W\.mp4:h265方式转码视频。
* ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4:视频的分辨率压缩为原先的一半
* ffmpeg -i input.mp4 frame\_%04d.png:视频的帧保存下来
-
ffmepg参数含义
- -y 不经过确认,输出时直接覆盖同名文件
- -v info 指定日志级别,常用的有info、error
- -i 指定输入文件或流地址
- -c 指定编码器,一般常用-c copy 表示直接复制不进行重新编码
- -c:v 指定视频编码器
- -c:a 指定音频解码器
- -an 去除音频流
- -vn 去除视频流
- -f 强制使用格式输出,常用有-f mp4、-f flv、-f segment
- -r 指定帧率,缺省25。例如-r 15
- -b bitrate 设置比特率,缺省200kb/s
- -b:v 调整视频码率 -b:a 音频
- -preset: 指定输出的视**频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
- -vf scale=480 **360 改变分辨率 eg:ffmpeg -i input.mp4 -vf scale=320*240 output.mp4
- -s 设置视频分辨率
- -q:v 2表示输出的图片质量,一般为1到5(1代表质量最高)
- -ss 开始时间
- -t 持续时间
- -to 结束时间
- -profile:a 指定音频编码格式 比如AAC_LC
5.H264再理解
-
前置知识
-
在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内。所以对于一段变化不大图像画面,我们可以先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小!B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。这段图像我们称为一个序列:序列就是有相同特点的一段数据。当某个图像与之前的图像变化很大,无法参考前面的帧来生成,那我们就结束上一个序列,开始下一段序列。
-
在H.264中定义了三种帧:
- I帧:完整编码的帧叫I帧
- P帧:参考之前的I帧生成的只包含差异部分编码的帧叫P帧
- B帧:参考前后的帧编码的帧叫B帧
-
H264采用的核心算法是帧内压缩和帧间压缩:
- 帧内压缩是生成I帧的算法
- 帧间压缩是生成B帧和P帧的算法
-
压缩方法:
- 分组:把几帧图像分为一组(GOP,也就是一个序列),为防止运动变化,帧数不宜取多
- 定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;
- 预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
- 数据传输:最后将I帧数据与预测的差值信息进行存储和传输。
-
GOP序列:在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流。一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像:
-
在视频编码序列中,GOP即Group of picture(图像组),指两个I帧之间的距离。
-
I帧、P帧、B帧实际顺序&&编码顺序:
-
H264算法在概念上分为两层:
- VCL:(Video Coding Layer)视频编码层,负责高效的内容表示。
- NAL:(Network Abstraction Layer)网络提取层,负责以网络所要求的恰当的方式对数据进行打包和传送。
- 目的是根据不同的网络把数据打包成相应的格式,将VCL产生的比特字符串适配到各种各样的网络和多元环境中。
-
H264压缩方式
-
H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
-
帧内(Intraframe)压缩也称为空间压缩。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩一般达不到很高的压缩,跟编码jpeg差不多。
-
帧间(Interframe)压缩的原理是:相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩,它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。
-
压缩方式说明
- Step1:分组,也就是将一系列变换不大的图像归为一个组,也就是一个序列,也可以叫GOP(画面组);
- Step2:定义帧,将每组的图像帧归分为I帧、P帧和B帧三种类型;
- Step3:预测帧, 以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
- Step4:数据传输, 最后将I帧数据与预测的差值信息进行存储和传输。
-
最后的目标是把上面的理论知识运用起来,制作一个属于自己的播放器,了解如何去修改播放器、音视频播放存在的缺点、怎么定制化,再去开源...
下面是来自DeepSeek的学习路线图介绍
一、基础准备(1-2周)
-
音视频基础概念
-
音频:采样率、位深、声道、PCM、WAV/MP3/AAC格式。
-
视频:分辨率、帧率、YUV/RGB格式、H.264/H.265/AV1编码。
-
学习资源:
- 《数字音频处理》第1-3章
- 《音视频开发基础知识》(知乎专栏)
-
-
Android开发环境强化
- 掌握NDK/JNI开发(音视频核心代码通常用C/C++实现)。
- 学习CMake编译配置,集成第三方库(如FFmpeg)。
- 实战练习:通过JNI调用C++代码实现简单的音频PCM转WAV。
二、Android音视频API(2-4周)
-
音频处理
-
核心API:
AudioRecord(录音)与AudioTrack(播放)。OpenSL ES(低延迟音频处理)和AAudio(Android 8.0+)。
-
实战项目:
- 实现录音并保存为WAV文件。
- 使用
AudioTrack播放原始PCM数据。
-
-
视频处理
-
核心API:
Camera2/CameraX(摄像头数据采集)。MediaCodec(硬编解码H.264/AAC)。SurfaceView/TextureView(视频渲染)。
-
实战项目:
- 通过
MediaCodec实现摄像头数据硬编码为MP4文件。 - 使用
Surface直接渲染YUV数据。
- 通过
-
-
媒体框架
MediaExtractor/MediaMuxer:音视频分离与封装。MediaPlayer/ExoPlayer:播放器开发与扩展。
三、编解码与处理(4-6周)
-
FFmpeg核心技能
-
编译与集成:为Android编译FFmpeg库(支持H.264/HEVC)。
-
常用操作:
- 音视频提取、转码、拼接、滤镜(水印、缩放)。
- 硬解码与软解码性能对比。
-
实战项目:
- 基于FFmpeg开发简易播放器(支持音视频同步)。
- 实现视频转GIF并添加水印。
-
-
编码原理进阶
- 掌握H.264的I/P/B帧、GOP、码率控制。
- 学习AAC的ADTS头解析、编码参数优化。
- 工具实践:使用
ffprobe分析视频流信息。
四、网络传输与实时通信(4-8周)
-
流媒体协议
-
协议栈:RTMP(直播推流)、HLS(拉流)、RTP/RTCP(实时传输)。
-
优化技术:CDN分发、QUIC协议、抗弱网(FEC/NACK)。
-
实战项目:
- 使用RTMP协议推流到腾讯云/阿里云CDN。
- 实现简单的HLS播放器。
-
-
WebRTC深度实践
-
核心能力:P2P连接、NAT穿透(STUN/TURN)、音视频同步。
-
Android集成:
- 基于WebRTC库实现1v1视频通话。
- 扩展功能:屏幕共享、美颜滤镜。
-
学习资源:
- WebRTC官方文档
- GitHub开源项目:linagora/OpenRTC
-
五、进阶实战项目(2-3个月)
-
直播应用开发
-
功能模块:
- 推流端:摄像头采集、美颜滤镜、RTMP推流。
- 播放端:ExoPlayer拉流、弹幕互动、礼物动画。
-
技术栈:FFmpeg + MediaCodec + WebSocket。
-
-
实时音视频通话
-
功能模块:
- 信令服务器(Socket.IO/SIP)。
- 客户端:WebRTC音视频传输、回声消除、网络状态监控。
-
优化方向:抗50%丢包、端到端延迟<200ms。
-
-
短视频处理工具
-
功能模块:
- 视频剪辑(FFmpeg命令行封装)。
- 特效添加(OpenGL ES渲染粒子效果)。
- 音频提取与混音。
-
六、高级方向与持续学习
-
性能优化
- 内存优化:YUV直出、避免Native层内存泄漏。
- 功耗优化:控制GPU渲染频率、使用硬件编解码。
-
AI与音视频结合
- 实时语音识别(ASR):集成TensorFlow Lite。
- 视频超分:基于ML的8K视频实时增强。
-
跨平台开发
- 学习Flutter音视频插件开发(如
flutter_webrtc)。 - 探索自研RTC引擎(支持Android/iOS/Web)。
- 学习Flutter音视频插件开发(如
七、推荐学习资源
-
书籍
- 《Android音视频开发》(何俊林)
- 《FFmpeg从入门到精通》(刘歧)
- 《WebRTC权威指南》(Alan B. Johnston)
-
开源项目
- Google官方示例:android/media-samples
- 哔哩哔哩播放器:ijkplayer
-
社区与课程
- 极客时间:《音视频开发入门到精通》
- GitHub Topics:Android-Media
学习路线图总结:
- 先工具后原理:从API和FFmpeg实战入手,再深入编解码算法。
- 小步快跑:每阶段完成1-2个Demo,积累成就感。
- 关注行业动态:跟进Google I/O、RTC技术大会最新技术。
掌握以上技能后,可胜任中高级Android音视频开发岗位,并向架构师或技术专家方向发展。