凯发手机娱乐官网_凯发首页
当前位置:主页 > 广告设计 >

音视频学习 (七) AudioTrack、OpenSL ES 音频渲染

发表日期:2020-07-20 13:02文章编辑:admin浏览次数: 标签:    

在解说音频烘托之前,需求对音频的根底知识有所了解,所以该篇分为根底概念和AudioTrack 以及 OpenSL ES Demo 实例解说,这样有助于更好的了解 Android 中音频烘托。

音频的根底概念触及的知识点比较多,该篇文章的上半部分会详细的介绍,后续文章根本上都会触及音频的开发,有了根底关于后边的内容就更简略上手了。

声响是波

提到声响我信任只需听力正常的人都听见过声响,那么声响是怎么发作的呢?记住初中物理课本上的描绘 - 声响是由物体的振荡而发作的。其实声响是一种压力波,当击打某个物体或演奏某个乐器时,它们的振荡都会引起空气有节奏的振荡,使周围的空气发作疏密改变,构成疏密相间的纵波,由此就发作了声波,这种现象会一向延续到振荡消失停止。

声波的三要素

声波的三要素是频率、振幅、和波形,频率代表音阶的凹凸,振幅代表响度,波形代表音色。

声响的传达介质

声响的传达介质很广,它能够经过空气、液体和固体进行传达;并且介质不同,传达的速度也不同,比方声响在空气中的传达速度为 340m/s , 在蒸馏水中的传达速度为 1497 m/s , 而在铁棒中的传达速度则能够高达 5200 m/s ;不过,声响在真空中时无法传达的。

回声

当咱们在高山或许空阔地带大声大喊的时分,常常会听到回声,之所以会有回声是由于声响在传达进程中遇到障碍物会反弹回来,再次被咱们听到。

可是,若两种声响传到咱们的耳朵里的时差小于 80 毫秒,咱们就无法区分隔这两种声响了,其实在日常日子中,人耳也在搜集回声,只不过由于喧闹的外接环境以及回声的分贝比较低,所以咱们的耳朵分辩不出这样的声响,或许说是大脑能接收到但分辩不出。

共识

自然界中有光能,水能,日子中有机械能,电能,其实声响也能够发作能量,例如两个频率相同的物体,击打其间一个物体时另一个物体也会振荡发作。这种现象称为共识,共识证明了声响传达能够带动另一个物体振荡,也便是说,声响的传达进程也是一种能量的传达进程。

上一末节咱们首要介绍了声响的物理现象以及声响中常见的概念,也会后续的解说一致了术语,本节首要介绍数字音频概念。

为了将模仿信号数字化,本节将分为 3 个概念对数字音频进行解说,别离是 采样、量化和编码 。首要要对模仿信号进行采样,所谓采样便是在时刻轴上对信号进行数字化。依据奈奎斯特定理,按比声响最高频率高 2 倍以上的频率对声响进行采样,关于高质量的音频信号,其频率规模在 20Hz ~ 20kHz ,所以采样频率一般为 44.1kHz ,这样就确保采样声响到达 20kHz 也能被数字化,然后使得经过数字化处理之后,人耳听到的声响质量不会被下降。而所谓的 44.1 kHz 便是代表 1 s 会采样 44100 次。

那么,详细的每个采样又该怎么表明呢?这就触及到即将解说的第二个概念: 量化。量化是指在起伏轴上对信号进行数字化,比方用 16 bit 的二进制信号来表明声响的一个采样,而 16 bit 所表明的规模是 [-32768 , 32767] , 共有 65536 个或许取值,因而终究模仿的音频信号在起伏上也分为了 65536 层。

已然每一个重量都是一个采样,那么这么多的采样该怎么进行存储呢?这就触及即将解说的第三个概念: 编码。所谓编码,便是依照必定的格局记载采样和量化后的数字数据,比方次序存储或紧缩存储等等。

这儿触及了许多中格局,一般所说的音频的裸数据便是 PCM 数据。描绘一段 PCM 数据一般需求以下几个概念:量化格局、采样率、声道数 。以 CD 的音质为例:量化格局为 16 bit ,采样率 44100 ,声道数为 2 ,这些信息就描绘了 CD 的音质。而关于声响的格局,还有一个概念用来描绘它的巨细,称为数据比特率,即 1s 时刻内的比特数目,它用于衡量音频数据单位时刻内的容量巨细。而关于 CD 音质的数据,比特率为多少呢? 核算如下:

44100 * 16 * 2 = 1378.125 kbps

那么在一分钟里,这类 CD 音质的数据需求占有多大的存储空间呢?核算如下:

1378.125 * 60 / 8 / 1024 = 10.09 MB

当然,假如 sampleFormat 愈加准确 ,或许 sampleRate 愈加密布 , 那么所占的存储空间就会更大,一起能够描绘的声响细节就会越准确。存储的这段二进制数据即表明将模仿信号转为数字信号了,今后就能够对这段二进制数据进行存储,播映,仿制,或许进行其它操作。

上面提到了 CD 音质的数据采样格局,曾核算出每分钟需求的存储空间约为 10.1MB ,假如仅仅是将其存储在光盘或许硬盘中,或许是能够承受的,可是若要在网络中实时在线传输的话,那么这个数据量或许就太大了,所以有必要对其进行紧缩编码。紧缩编码的根本目标之一便是紧缩比,紧缩比一般小于 1 。紧缩算法包含有损紧缩和无损紧缩。无所紧缩是指解压后的数据不能彻底恢复,会丢掉一部分信息,紧缩比较小,丢掉的信息就比较多,信号复原后的失真就会越大。依据不同的运用场景 ,能够选用不同的紧缩编码算法,如 PCM 、WAV、AAC 、MP3 、Ogg 等。

WAV 编码

WAV 编码便是在 PCM 数据格局的前面加了 44 个字节,别离用来存储 PCM 的采样率、声道数、数据格局等信息。

特色:音质好,很多软件支撑。

场景:多媒体开发的中心文件、保存音乐和音效资料。

MP3 编码

MP3 具有不错的紧缩比,运用 LAME 编码 的中高码率的 MP3 文件,听感上十分挨近源 WAV 文件,当然在不同的运用场景下,应该调整适宜的参数以到达最好的作用。

特色:音质在 128 Kbit/s 以上体现还不错,紧缩比比较高,很多软件和硬件都支撑,兼容性好。

场景:高比特率下对兼容性有要求的音乐欣赏。

AAC 编码

AAC 是新一代的音频有损紧缩技能,它经过一些附加的编码技能 等,衍生出了 LC-AAC 、HE-AAC 、HE-AAC v2 三种首要的编码格局。LC-AAC 是比较传统的 AAC ,相对而言,其首要运用于中高码率场景的编码 ; HE-AAC 相当于 AAC SBR 首要运用于中低码率的编码 ; 而新推出的 HE-AAC v2 相当于 AAC SBR PS 首要用于低码率场景的编码 。事实上大部分编码器都设置为 = 48Kbit/s 主动启用 PS 技能,而 48Kbit/s 则不加 PS ,相当于一般的 HE-AAC。

特色:在小于 128Kbit/s 的码率下体现优异,并且多用于视频中的音频编码。

场景:128 Kbit/s 以下的音频编码,多用于视频中音频轨的编码。

Ogg 编码

Ogg 是一种十分有潜力的编码,在各种码率下都有比较优异的体现,尤其是在中低码率场景下。Ogg 除了音质好之外,仍是彻底免费的,这为 Ogg 取得更多的支撑打好了根底,Ogg 有着十分超卓的算法,能够用更小的码率到达更好的音质,128 Kbit/s 的 Ogg 比 192kbit/s 乃至更高码率的 MP3 还要超卓。可是现在由于还没有媒体服务软件的支撑,因而依据 Ogg 的数字播送还无法完成。Ogg 现在受支撑的状况还不够好,无论是软件上的仍是硬件上的支撑,都无法和 MP3 混为一谈。

特色:能够用比 MP3 更小的码率完成比 MP3 更好的音质,高中低码率下均有杰出的体现,兼容性不够好,流媒体特性不支撑。

场景:言语谈天的音频音讯场景。

音频根底概念上面讲完了,下面咱们完成 Android 下的音频烘托,为完成音视频播映器打下一个根底,音视频收集视频录制的时分在解说。

[PCM 文件 - 链接:https://pan.baidu.com/s/1ISS7bHMrFAentLB6o4kiBA 暗码:5z1n]

由于 AudioTrack 是 Android SDK 层供给的最底层的 音频播映 API,因而只允许输入裸数据 PCM 。和 MediaPlayer 比较,关于一个紧缩的音频文件,它只需求自行完成解码操作和缓冲区操控。由于这儿只触及 AudioTrack 的音频烘托端,编解码咱们后边在解说,所以本末节只介绍怎么运用 AudioTrack 烘托音频 PCM 裸数据。

装备 AudioTrack

public AudioTrack

streamType:Android 手机供给了多重音频办理战略,当体系又多个进程需求播映音频的时分,办理战略会决议终究的出现作用,该参数的可选值将以常量的方式界说在类 AudioManager 中,首要包含以下内容:

/**电话铃声 */
 public static final int STREAM_VOICE_CALL = AudioSystem.STREAM_VOICE_CALL;
 /** 体系铃声 */
 public static final int STREAM_SYSTEM = AudioSystem.STREAM_SYSTEM;
 /** 铃声*/
 public static final int STREAM_RING = AudioSystem.STREAM_RING;
 /** 音乐声 */
 public static final int STREAM_MUSIC = AudioSystem.STREAM_MUSIC;
 /** 正告声 */
 public static final int STREAM_ALARM = AudioSystem.STREAM_ALARM;
 /** 告诉声 */
 public static final int STREAM_NOTIFICATION = AudioSystem.STREAM_NOTIFICATION;

sampleRateInHz:采样率,即播映的音频每秒钟会有没少次采样,可选用的采样频率列表为: 8000 , 16000 , 22050 , 24000 ,32000 , 44100 , 48000 等,我们能够依据自己的运用场景进行合理的挑选。

channelConfig:声道数的装备,可选值以常量的方式装备在类 AudioFormat 中,常用的是 CHANNEL_IN_MONO 、CHANNEL_IN_STEREO ,由于现在大多数手机的麦克风都是伪立体声收集,为了功用考虑,主张运用单声道进行收集。

audioFormat:该参数是用来装备 数据位宽 的,即采样格局,可选值以常量的方式界说在类 AudioFormat 中,别离为 ENCODING_PCM_16BIT 、ENCODING_PCM_8BIT ,

bufferSizeInBytes:装备内部的音频缓冲区的巨细, AudioTrack 类供给了一个协助开发者确认的 bufferSizeInBytes 的函数,其原型详细如下:

static public int getMinBufferSize

在实践开发中,强烈主张由该函数核算出需求传入的缓冲区巨细,而不是手动核算。

mode:AudioTrack 供给了两种播映方式,可选的值以常量的方式界说在类 AudioTrack 中,一个是 MODE_STATIC , 需求一次性将一切的数据都写入播映缓冲区中,简略高效,一般用于播映铃声、体系提示的音频片段;另一个是 MODE_STREAM ,需求依照必定的时刻距离不断地写入音频数据,理论上它能够运用于任何音频播映的场景。

Play

//当时播映实例是否初始化成功,假如处于初始化成功的状况并且未播映的状况,那么就调用 play
if  != AudioTrack.STATE_UNINITIALIZED mAudioTrack.getPlayState != PLAYSTATE_PLAYING)
 mAudioTrack.play;

毁掉资源

public void release {
 Log.d {
 mAudioTrack.release;
 mAudioTrack = null;
 }

详细实例请移步 AudioPlay 项目的 AudioTracker 部分 ,需求把项目中 raw 目录下的 pcm 文件放入 sdcard 跟目录中。

OpenSL ES 官方文档

OpenSL ES 全称 ,即嵌入式音频加快规范。OpenSL ES 是无授权费、跨渠道、针对嵌入式体系精心优化的硬件音频加快 API ,它能为嵌入式移动多媒体设备上的本地运用程序开发者供给了规范化、高功用、低呼应时刻的音频功用完成办法,一起还完成了软/硬音频功用的直接跨渠道布置,不只下降了履行难度,并且还促进了高档音频商场的开展。

上图描绘了 OpenSL ES 的架构,在 Android 中,High Level Audio Libs 是音频 Java 层 API 输入输出,归于高档 API , 相对来说,OpenSL ES 则是比价低层级的 API, 归于 C 言语 API 。在开发中,一般会直接运用高档 API , 除非遇到功用瓶颈,如语音实时谈天、3D Audio 、某些 Effects 等,开发者能够直接经过 C/C 开发依据 OpenSL ES 音频的运用。

在运用 OpenSL ES 的 API 之前,需求引进 OpenSL ES 的头文件,代码如下:

// 这是规范的OpenSL ES库
返回列表
  • 上一篇:没有了
  • 下一篇:没有了
相关新闻