当前位置:   article > 正文

Android音频系统之AudioTrack(一)_这里调用了native_setup来创建一个本地audiotrack对象

这里调用了native_setup来创建一个本地audiotrack对象

1.1 AudioTrack

1.1.1 AudioTrack应用实例

对于Android应用开发人员来讲,音频回放最熟悉的莫过于MediaPlayer,而AudioTrack相信用的人相对会少很多。这是因为MediaPlayer提供了更完整的封装和状态控制,使得我们用很少的代码就可以实现一个简单的音乐播放器。而相比MediaPlayer,AudioTrack更为精练、高效,实际上MediaPlayerService的内部实现就是使用了AudioTrack。

AudioTrack被用于PCM音频流的回放,在数据传送上它有两种方式:

Ø  调用write(byte[],int,int)或write(short[],int,int)把音频数据“push”到AudioTrack中。

Ø  与之相对的,当然就是“pull”形式的数据获取,即数据接收方主动索取的过程,如下图所示:

 


图 13‑20 “push”和“pull”两种数据传送模式

 

除此之外,AudioTrack还同时支持static和streaming两种模式:

§  static

静态的言下之意就是数据一次性交付给接收方。好处是简单高效,只需要进行一次操作就完成了数据的传递;缺点当然也很明显,对于数据量较大的音频回放,显然它是无法胜任的,因而通常只用于播放铃声、系统提醒等对内存小的操作

§  streaming

流模式和网络上播放视频是类似的,即数据是按照一定规律不断地传递给接收方的。理论上它可用于任何音频播放的场景,不过我们一般在以下情况下采用:

Ø  音频文件过大

Ø  音频属性要求高,比如采样率高、深度大的数据

Ø  音频数据是实时产生的,这种情况就只能用流模式了

 

下面我们选取AudioTrackTest.java为例来讲解,先从使用者的角度来了解下AudioTrack。

/*cts/tests/tests/media/src/android/media/cts*/

    public voidtestSetStereoVolumeMax()  throwsException {

        final String TEST_NAME= "testSetStereoVolumeMax";

        final int TEST_SR =22050;

        final int TEST_CONF =AudioFormat.CHANNEL_CONFIGURATION_STEREO;

        final int TEST_FORMAT= AudioFormat.ENCODING_PCM_16BIT;

        final int TEST_MODE =AudioTrack.MODE_STREAM;

        final intTEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;

 

        // --------initialization --------------

                                /*Step1.*/

        int  minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);

         /*Step 2.*/

        AudioTrack  track = newAudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF,

                                                                                                                                                 TEST_FORMAT, 2 * minBuffSize,TEST_MODE);

        byte data[] = newbyte[minBuffSize];

        // -------- test--------------

        track.write(data, OFFSET_DEFAULT, data.length);

        track.write(data, OFFSET_DEFAULT, data.length);

        track.play();

        float maxVol =AudioTrack.getMaxVolume();

        assertTrue(TEST_NAME, track.setStereoVolume(maxVol, maxVol) == AudioTrack.SUCCESS);

        // -------- tear down--------------

        track.release();

    }

这个TestCase是测试立体声左右声道最大音量的。顺便提一下,关于自动化测试的更多描述,可以参照本书最后一个篇章。用例中涉及到AudioTrack的常规操作都用高显标示出来了。可见大概是这么几个步骤:

Step1@ testSetStereoVolumeMax,getMinBufferSize

字面意思就是获取最小的buffer大小,这个buffer将用于后面AudioTrack的构造函数。它是AudioTrack可以正常使用的一个最低保障,根据官方的建议如果音频文件本身要求较高的话,最好可以采用比MinBufferSize更大的数值。这个函数的实现相对简单ÿ

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/318930
推荐阅读
相关标签
  

闽ICP备14008679号