【安卓】音视频开发入门

文章目录

  • 音视频开发学习思路
    • 关于开发的思考
    • 音视频开发的内容
      • 采集
      • 渲染
      • 处理
      • 传输
  • 音频基础知识
    • 基础概念
      • 采样率(samplerate)
      • 量化精度(位宽)
      • 声道数(channels)
      • 音频帧(frame)
    • 编码
  • 视频基础知识
    • 基础概念
      • 帧率
      • 刷新率
      • 分辨率
      • 码率
      • YUV和RGB
      • 视频帧
    • 编码
  • 需要学习的音视频技能:
    • 操作系统提供的API
    • 入门项目
    • 进一步提升
  • 参考文献


*** 本文内容大部分转载自大佬的博客,外加自己的整理,看原文可找我给的链接。感谢各位大佬。***

音视频开发学习思路

本节所转载的参考文献:从开发小白到音视频专家https://blog.51cto.com/ticktick/2046899

关于开发的思考

无论是Windows、Linux、Android还是iOS开发,都没有什么优劣之分,它们有的共同点就是:都是基于操作系统提供的API完成特定需求的实现。当然也有这不同的地方:1.系统的API和特性不同,2.编程语言不同,Windows/Linux以C/C++为主,Android以Java为主,iOS以Object C为主。无论是什么平台,其学习曲线是类似的,差不多经历如下的环节:

  1. 学习对应平台的编程语言,如:C/C++,Java,Object C,Javascript 等。
  2. 熟悉对应平台提供的 API,如:UI 库,网络,文件,数据库, 图片处理,多媒体处理 等等。
  3. 掌握平台相关的特性、框架和原理,如:Windows 的 WINSOCK,ODBC,WPF 等,Unix 的设计哲学,Android 的四大组件,iOS 的 MVC 模式等等。
  4. 通过具体的项目,熟悉和练手,达到可完成任意功能的开发。

基于平台的API走应用开发并不是一个可以走的多远的方向,真正有价值的地方在于与具体的业务方向结合,比如:网络安全、音视频、只能硬件、深度学习、大数据、金融、通信等等。

音视频开发的内容

音视频开发,就是要掌握图像、音频、视频的基础知识,并且学会如何对它们进行采集、渲染、处理、传输等一系列的开发和应用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tnTt5PCR-1632925319499)(C:/Users/FYB/AppData/Roaming/Typora/typora-user-images/image-20210927093322096.png)]

  • 采集:它解决的是,数据从哪里来的问题
  • 渲染:它解决的是,数据怎么展现的问题
  • 处理:它解决的是,数据怎么加工的问题
  • 传输:它解决的是,数据怎么共享的问题

每一个门类,都可以深挖,衍生出一个又一个充满技术挑战的话题,比如:如何更高效地渲染画面、如何提高音视频的压缩比,如何优化弱网下的音视频数据传输等等。

采集

采集,它解决的是,数据从哪里来的问题,那么,数据究竟从哪里来的呢 ?其实无论在哪个平台,图像、视频最初都是来自摄像头,而音频最初都是来自麦克风,因此,做音视频采集,就要掌握如下的技术知识:

  1. 系统的摄像头采集接口是什么,怎么用 ?比如:Windows:DirectShow,Linux:V4L2,Android:Camera,iOS:AVCaptureSession等。

  2. 系统的摄像头采集的参数怎么配置,都是什么含义 ?比如:分辨率、帧率、预览方向、对焦、闪光灯等。

  3. 系统的摄像头输出的图像/视频数据,是什么格式,不同格式有什么区别 ?比如:图片:JPEG,视频数据:NV21,NV12,I420等。

  4. 系统的麦克风采集接口是什么,怎么用 ?比如:Windows:DirectShow,Linux:ALSA & OSS,Android:AudioRecord,iOS:Audio Unit 等。

  5. 系统的麦克风采集参数怎么配置,都是什么含义 ?比如:采样率,通道号,位宽 等。

  6. 系统的麦克风输出的音频数据,是什么格式?比如:PCM。

渲染

渲染,它解决的是,数据怎么展现的问题,那么,数据究竟怎么展现呢 ?其实无论在哪个平台,图像、视频最终都是要绘制到视图上面,而音频最终都是要输出到扬声器,因此,做音视频渲染,就要掌握如下的技术知识:

  1. 系统提供了哪些 API 可以绘制一张图片或者一帧 YUV 图像数据的 ?比如:Windows:DirectDraw, Direct3D, GDI,OpenGL 等
    Linux: GDI, OpenGL 等
    Android:ImageView,SurfaceView,TextureView,OpenGL 等
    iOS: CoreGraphics,OpenGL 等。

  2. 系统提供了哪些 API 可以播放一个 mp3 或者 pcm 数据 ?比如:

    Windows:DirectSound 等
    Linux:ALSA & OSS 等
    Android:AudioTrack 等
    iOS: AudioQueue 等。

处理

处理,它解决的是,数据怎么加工的问题,那么,数据究竟可以怎么加工呢 ?图像/音视频的数据可以做哪些加工 ?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LsMUrzw8-1632925319502)(C:/Users/FYB/AppData/Roaming/Typora/typora-user-images/image-20210927094104389.png)]

其实无论在哪个平台,图像和音视频的加工,除了系统的 API,大多数都会依赖一些跨平台的第三方库的,通过掌握这些第三方库的原理和使用方法,基本上就可以满足日常音视频处理工作了,这些库包括但不限于:

  1. 图像处理:OpenGL,OpenCV,libyuv,ffmpeg 等。
  2. 视频编解码:x264,OpenH264,ffmpeg 等。
  3. 音频处理:speexdsp,ffmpeg 等。
  4. 音频编解码:libfaac,opus,speex,ffmpeg 等。

因此,学习和掌握这些第三方库的使用,非常有必要。

传输

传输,它解决的是,数据怎么共享的问题,那么,数据究竟怎么共享呢 ?共享,最重要的一点,就是协议。,研究音视频传输,其实就是在研究协议,具体有哪些协议呢 ?

  1. 音视频在传输前,怎么打包的,如:FLV,ts,mpeg4 等。
  2. 直播推流,有哪些常见的协议,如:RTMP,RTSP 等。
  3. 直播拉流,有哪些常见的协议,如:RTMP,HLS,HDL,RTSP 等。
  4. 基于 UDP 的协议有哪些?如:RTP/RTCP,QUIC 等。

音频基础知识

基础概念

采样率(samplerate)

所有的模拟信号都需要采样转换为0101的数字信号表示,音频信号也是。根据奈奎斯特理论,采样频率只要不低于音频信号最高频率的两倍,就可以无损失地还原原始的声音。通常人耳能听到频率范围大约在20Hz~20kHz之间的声音,为了保证声音不失真,采样频率应在40kHz以上。常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。

量化精度(位宽)

在模拟信号的每一个采样点,都需要用一串0101的二进制数表示,比如4bit、8bit、16bit、32bit等等。其位数越多,表示越精细,声音质量越好,但是数据量也会成倍增大。

声道数(channels)

由于音频的采集和播放是可以叠加的,因此,可以同时从多个音频源采集声音,并分别输出到不同的扬声器,故声道数一般表示声音录制时的音源数量或回放时相应的扬声器数量。单声道(Mono)和双声道(Stereo)比较常见,顾名思义,前者的声道数为1,后者为2。另外还有4声道、4.1声道、5.1声道、7.1声道。

音频帧(frame)

音频跟视频很不一样,视频每一帧就是一张图像,而从上面的正玄波可以看出,音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms~60ms为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编×××和具体应用的需求来决定的,我们可以计算一下一帧音频帧的大小:假设某通道的音频信号是采样率为8kHz,位宽为16bit,20ms一帧,双通道,则一帧音频数据的大小为:int size = 8000 x 16bit x 0.02s x 2 = 5120 bit = 640 byte。

AMR帧比较简单,它规定每20ms的音频是1帧,每一帧音频都是独立的,有可能采用不同的编码算法以及不同的编码参数。

MP3帧较复杂一些,包含了更多的信息,比如采样率、比特率等各种参数。具体如下:音频数据帧个数由文件大小和帧长决定,每一帧的长度可能不固定,也可能固定,由比特率决定,每一帧又分为帧头和数据实体两部分,帧头记录了MP3的比特率、采样率、版本等信息,每一帧之间相互独立。

编码

PCM 和 ADPCM是无损的原始数字音频信号,添加一些文件头信息,就可以存储为WAV文件了,它是一种由微软和IBM联合开发的用于音频数字存储的标准,可以很容易地被解析和播放。其他常见的音频压缩格式有:MP3,AAC,OGG,WMA,Opus,FLAC,APE,m4a,AMR,等等。

最常用的音频编码格式有AAC、MP3、AC3:

  • AAC:一种专为声音数据设计的文件压缩格式,与MP3不同,它采用了全新的算法进行编码,更加高效,具有更高的“性价比”。利用AAC格式,在感觉声音质量没有明显降低的前提下,可使文件更加小巧。苹果iPod、诺基亚手机也支持AAC格式的音频文件。AAC的优点是,相对于MP3,AAC格式的音质更佳,文件更小。AAC的缺点是,AAC属于有损压缩格式,与时下流行的APE、FLAC等无损压缩格式相比音质存在“本质上”的差距;加之,传输速度更快的USB 3.0和16GB以上大容量MP3正在加速普及,这也使得AAC头上“小巧”的光环逐渐暗淡。
  • :MP3是一种音频压缩技术,其全称是动态影像专家压缩标准音频层面3(Moving Picture Experts Group Audio Layer II),简称为MP3。它被设计用来大幅度地降低音频数据量。利用MP3技术,将音乐以1:10甚至1:12的压缩率,压缩成容量较小的文件,而对于大多数用户来说,重放的音质与最初的不压缩音频相比没有明显下降。MP3的特点是,其利用人耳对高频声音信号不敏感的特性,将时域波形信号转换成频域信号,并划分成多个频段,对不同的频段使用不同的压缩率,对高频信号使用大压缩率(甚至忽略信号),对低频信号使用小压缩率,保证信号不失真。这样一来就相当于抛弃人耳基本听不到的高频声音,只保留能听到的低频部分,从而将声音用1:10甚至1:12的压缩率压缩。
  • 全称为Audio Coding Version 3,是Dolby实验室所发展的有损音频编码格式。AC3被广泛应用于5.1声道,是Dolby Pro Logic的继承者,不同的地方在于AC3提供了6个独立的声道而Pro Logic混合其环绕声道。AC3普及程度很高,以384-448kb/s的码率应用于激光唱片和DVD,也经常以640kb/s的码率广泛应用于电影院。DolbyAC3提供的环绕声系统由5个全频域声道和1个超低音声道组成,被称为5.1声道。5个全频域声道包括左前、中央、右前、左后、右后。超低音声道主要提供一些额外的低音信息,使一些场景(如爆炸、撞击等)的声音效果更好。

视频基础知识

基础概念

帧率

帧率(Frame Rate)是用于测量显示帧数的量度,通常为每秒显示帧数(frames per second,简称fps)或“赫兹”(Hz)。

每秒显示帧数(fps)或者帧率表示图形处理器处理场时每秒能够更新的次数。高帧率可以得到更流畅、更逼真的动画。一般来说,30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是超过75fps就不容易察觉有明显的流畅度提升了。如果帧率超过屏幕刷新率,则只会浪费图像处理能力,因为监视器不能以这么快的速度更新,这样超过刷新率的帧率就浪费掉了。

刷新率

刷新率是指屏幕每秒画面被刷新的次数,刷新率分为垂直刷新率和水平刷新率,一般提到的刷新率通常指垂直刷新率。垂直刷新率表示屏幕上图像每秒重绘多少次,也就是每秒屏幕刷新的次数,以Hz(赫兹)为单位。刷新率越高,图像就越稳定,图像显示就越自然清晰,对眼睛的影响也越小。刷新率越低,图像闪烁和抖动得就越厉害,眼睛疲劳得就越快。一般来说,如能达到80Hz以上的刷新率,就可以完全消除图像闪烁和抖动感,眼睛也不太容易疲劳。

分辨率

指视频成像产品所形成的图像大小或尺寸。

码率

码率也就是比特率,比特率是单位时间播放连续的媒体(如压缩后的音频或视频)的比特数量。比特率越高,带宽消耗得越多。比特(bit)就是二进制里面最小的单位,要么是0,要么是1。文件大小(b)=码率(b/s)×时长(s)

YUV和RGB

  • YUV:是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),其中Y代表亮度,UV代表色差,U和V是构成颜色的两个分量。也被称为YCrCb,应为“YCbCr”,在在YUV家族中,YCbCr是在计算机系统中应用最多的成员,其应用领域很广泛,JPEG、MPEG均采用此格式。一般人们所讲的YUV大多是指YCbCr。
  • RGB:是一种颜色空间模型,通过对红®、绿(G)、蓝(B)3个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色,RGB即代表红、绿、蓝3个通道的颜色。

视频帧

常见的视频帧有I、P、B帧等:

  • I帧表示关键帧,可以理解为这一帧画面的完整保留,解码时只需要本帧数据就可以完成(因为包含完整画面)。

  • P帧表示的是这一帧和之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据。)

  • B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面数据与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较吃力。

编码

所谓的视频编码就是指通过特定的压缩技术,将某个视频格式文件转换成另一种视频格式文件的方式。视频流传输中最重要的编解码标准有国际电联的H.261、H.263、H.264,运动静止图像专家组的M-JPEG和国际标准化组织运动图像专家组的MPEG系列标准,此外在互联网上被广泛应用的还有Real-Networks的RealVideo、微软公司的 WMV 以及 Apple公司的QuickTime等。

视频编码主要分为两个系列:

  1. MPEG系列:(由ISO[国际标准化组织]下属的MPEG[运动图像专家组]开发)视频编码方面主要是MPEG1(VCD用的就是它)、MPEG2(DVD使用)、MPEG4(DVDRIP使用的都是它的变种,如DivX、XviD等)、MPEG4 AVC(正热门)。其还有音频编码方面,主要是MPEG Audio Layer 1/2、MPEG Audio Layer 3(大名鼎鼎的MP3)、MPEG-2AAC、MPEG-4AAC等。注意,DVD音频没有采用MPEG的。
  2. H.26X系列:(由ITU[国际电传视讯联盟]主导,侧重网络传输,注意,只有视频编码)包括H.261、H.262、H.263、H.263+、H.263++、H.264(就是与MPEG4 AVC合作的结晶)。

需要学习的音视频技能:

操作系统提供的API

iOS开发掌握好AVFoundation就足够了。

Android角度:

  • 学习Android上的音视频API

    Mideoplayer等等,了解安卓系统提供API的使用方式、参数设置等等,同时可以熟悉音视频相关的基础概念等。

  • 学习OpenGL渲染与FFmpeg

    OpenGL比较偏向图形学。简单入门可以学习雷霄骅的博客。

  • 学习开源项目源码

    学习项目源码,FFmplay等

入门项目

几个堪称教科书级别的安卓音视频入门项目:

  • Android-gpuimage

    偏向渲染,掌握OpenGL渲染链和Shader的写法

    https://github.com/cats-oss/android-gpuimage

  • AudioVideoRecordingSample

    偏向录制,实现Android上的音频和视频录制

    https://github.com/saki4510t/AudioVideoRecordingSample

  • Grafika

    综合应用,OpenGL和视频录制等多个样例

    https://github.com/google/grafika

进一步提升

OpenGL学习了之后,该怎么办?

  • OpenGL在音视频中的作用
    • FFmpeg -> OpenGL -> Screen
  • OpenGL算是另一门学科了
    • 学习更多渲染和图形学方面的技能,比如关照、阴影
    • 学习渲染引擎方面的开发,尤其是游戏开发领域

掌握了技能点之后如何进阶?

  • 系统设计与框架搭建能力
  • 站在业务角度发展与进步

微信读书:《在线视频技术精要》

学习个人博客:https://glumes.com/

参考文献

  1. 安卓音视频开发入门指南:https://blog.51cto.com/ticktick/1956269

  2. 从开发小白到音视频专家:https://blog.51cto.com/ticktick/2046899

  3. Android音频开发(1):基础知识 https://blog.51cto.com/ticktick/1748506

  4. 《Android音视频开发》 何俊林 著,电子工业出版者。

  5. B站视频:https://www.bilibili.com/video/BV1p54y1X7fY?spm_id_from=333.999.0.0

你可能感兴趣的:(android,c++,音频编码解码,java,音视频)