aecandroid_Android音频开发(1):基础知识

先来点闲言碎语,前段时间我有一段感悟:Android开发,本身并不是一个可以走得多远的方向,它只是一个平台,提供了许多封装好的API,让大家能够快速开发出针对特定业务的应用。

真正有价值的地方就在于Android与具体的业务方向结合,比如:Android与音视频技术,Android与智能硬件交互,Android与前端技术的融合与探索,Android信息安全,Android源码深度定制等等。

我一直比较看好音视频/多媒体方向,希望在此能够深入积累和探索,前段时间我发布了一款Android VoIP网络电话应用”飞鸽电话”,并写了一篇分析其整体架构的文章《PigeonCall:一款Android VoIP网络电话App架构分析》,欢迎有兴趣的小伙伴们先看一看。

在这个应用的开发过程中学到的东西还蛮多的,因此想写一些文章分享分享,本文作为开篇,主要以问答的形式,介绍一些音频开发的基础常识,非常重要,因为不了解这些常识,很多Android API或者第三方库的参数,你都不知道该怎么配置。

  1. 音频开发的主要应用有哪些?

音频播放器、录音机、语音电话、音频和视频监控应用、音频和视频直播应用、音频编辑/处理软件、蓝牙耳机/扬声器等。

[En]

Audio player, tape recorder, voice phone, audio and video surveillance application, audio and video live broadcast application, audio editing / processing software, Bluetooth headset / speaker, etc.

  1. 音频开发的具体内容有哪些?

(1)音频采集/播放

(2)音频算法处理(去噪、静音检测、回声消除、音效处理、功放/增强、混音/分离,等等)

(3)音频的编解码和格式转换

(4)音频传输协议的开发(SIP,A2DP、AVRCP,等等)

  1. 音频应用的难点在哪?

延时敏感、卡顿敏感、噪声抑制(Denoise)、回声消除(AEC)、静音检测(VAD)、混音算法,等等。

  1. 音频开发基础概念有哪些?

在音频开发中经常会遇到以下概念。

[En]

The following concepts are often encountered in audio development.

(1) 采样率(samplerate)

采样是将模拟信号数字化的过程。不仅音频信号需要采样,所有模拟信号都需要采样并转换成可以用0101表示的数字信号。原理图如下:

[En]

Sampling is the process of digitizing analog signals. Not only audio signals need to be sampled, but all analog signals need to be sampled and converted into digital signals that can be represented by 0101. The schematic diagram is as follows:

蓝色表示模拟音频信号,红点表示采样的量化值。

[En]

The blue represents the analog audio signal, and the red dot represents the quantized value sampled.

采样频率越高,红色间隔越密集,用于记录该音频信号的数据量越大,音频质量越高。

[En]

The higher the sampling frequency, the denser the red interval, the greater the amount of data used to record this audio signal, and the higher the audio quality.

根据奈奎斯特理论,只要采样频率不低于音频信号最高频率的两倍,就可以无损地恢复原始声音。

[En]

According to Nyquist theory, the original sound can be restored without loss as long as the sampling frequency is not less than twice the highest frequency of the audio signal.

通常人耳能听到频率范围大约在20Hz~20kHz之间的声音,为了保证声音不失真,采样频率应在40kHz以上。常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。

(2) 量化精度(位宽)

上图中,每一个红色的采样点,都需要用一个数值来表示大小,这个数值的数据类型大小可以是:4bit、8bit、16bit、32bit等等,位数越多,表示得就越精细,声音质量自然就越好,当然,数据量也会成倍增大。

常见的位宽是:8bit 或者 16bit

(3) 声道数(channels)

由于音频采集和播放可以叠加,因此可以同时从多个音频源采集声音并输出到不同的扬声器,因此通道数通常代表录制时的音源数量或播放时相应的扬声器数量。

[En]

Because audio acquisition and playback can be superimposed, sound can be collected from multiple audio sources at the same time and output to different loudspeakers, so the number of channels generally represents the number of sound sources when recording or the corresponding number of speakers during playback.

单声道(Mono)和双声道(Stereo)比较常见,顾名思义,前者的声道数为1,后者为2

(4) 音频帧(frame)

这一概念在应用程序开发中非常重要,互联网上的许多文章都没有具体介绍这一概念。

[En]

This concept is very important in application development, and many articles on the Internet do not specifically introduce this concept.

音频跟视频很不一样,视频每一帧就是一张图像,而从上面的正玄波可以看出,音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms~60ms为单位的数据量为一帧音频。

这个时间被称之为”采样时间”,其长度没有特别的标准,它是根据编×××和具体应用的需求来决定的,我们可以计算一下一帧音频帧的大小:

假设某通道的音频信号是采样率为8kHz,位宽为16bit,20ms一帧,双通道,则一帧音频数据的大小为:

int size = 8000 x 16bit x 0.02s x 2 = 5120 bit = 640 byte

  1. 常见的音频编码方式有哪些?

上面提到过,模拟的音频信号转换为数字信号需要经过采样和量化,量化的过程被称之为编码,根据不同的量化策略,产生了许多不同的编码方式,常见的编码方式有:PCM 和 ADPCM,这些数据代表着无损的原始数字音频信号,添加一些文件头信息,就可以存储为WAV文件了,它是一种由微软和IBM联合开发的用于音频数字存储的标准,可以很容易地被解析和播放。

我们在音频开发过程中,会经常涉及到WAV文件的读写,以验证采集、传输、接收的音频数据的正确性。

  1. 常见的音频压缩格式有哪些?

首先,我们简单介绍一下音频数据压缩的最基本原理:因为有冗余信息,所以可以压缩。

[En]

First of all, let’s briefly introduce the most basic principle of audio data compression: because there is redundant information, it can be compressed.

(1) 频谱掩蔽效应: 人耳所能察觉的声音信号的频率范围为20Hz~20KHz,在这个频率范围以外的音频信号属于冗余信号。

(2) 时域掩蔽效应: 当强音信号和弱音信号同时出现时,弱信号会听不到,因此,弱音信号也属于冗余信号。

以下是常见音频压缩格式的简要列表:

[En]

The following is a brief list of common audio compression formats:

MP3,AAC,OGG,WMA,Opus,FLAC,APE,m4a,AMR,等等

  1. Adndroid VoIP相关的开源应用有哪些 ?

imsdroid,sipdroid,csipsimple,linphone,WebRTC 等等

  1. 音频算法处理的开源库有哪些 ?

speex、ffmpeg,webrtc audio module(NS、VAD、AECM、AGC),等等

  1. Android提供了哪些音频开发相关的API?

音频采集: MediaRecoder,AudioRecord

音频播放: SoundPool,MediaPlayer,AudioTrack (它们之间的区别可以参考这篇文章)

音频编解码: MediaCodec

NDK API: OpenSL ES

  1. 音频开发的延时标准是什么?

ITU-TG.114规定,对于高质量语音可接受的时延是300ms。一般来说,如果时延在300~400ms,通话的交互性比较差,但还可以接受。时延大于400ms时,则交互通信非常困难。

  1. 小结

音频开发的知识点其实挺多的,一篇文章也无法详细地展开叙述,因此,不够全面和详尽的地方,请大家搜索专业的资料进行深入了解。文章中有不清楚的地方欢迎留言或者来信 lujun.hust@gmail.com 交流,或者关注我的新浪微博 @卢_俊 或者 微信公众号 @Jhuster 获取最新的文章和资讯。

Original: https://blog.csdn.net/weixin_39777540/article/details/111732088
Author: weixin_39777540
Title: aecandroid_Android音频开发(1):基础知识

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/525723/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球