首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioTrack未播放满缓冲区

AudioTrack未播放满缓冲区
EN

Stack Overflow用户
提问于 2012-08-13 12:13:42
回答 3查看 2.5K关注 0票数 2

我正试着用600赫兹播放10s的声音,但我得到的却是600赫兹的声音,持续时间不超过3秒。有人能指出我做错了什么吗?

代码语言:javascript
复制
    int minBuffersize = AudioTrack.getMinBufferSize(samplerate, 
           AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT);

    int size= (int) ((10f*samplerate)
            /minBuffersize +1);

            size*=minBuffersize;//round to the nearest minBuffersize multiple so I don't get an error

    short[] play= new short[size];

    for(int i =0;i<play.length;i++){
        float time=(float)i/(float)samplerate;

        play[i]=(short) (((float)Short.MAX_VALUE/10f)*Math.sin(
                600f
                *time
                *(2f*Math.PI)));
    }

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC,
            samplerate,
            AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            play.length,
            AudioTrack.MODE_STATIC);


    int result=at.write(play,0,play.length);

    Log.d("!!!", "result: "+result);

    at.play();

调试行返回的位置

代码语言:javascript
复制
result: 221184

始终如一。

请注意,play.length = 442368。

经过更多的实验,缓冲区始终是play.length的一半,但声音本身只能持续3-5秒,无论缓冲区有多大。

EN

回答 3

Stack Overflow用户

发布于 2012-10-23 03:24:40

AudioTrack需要以字节为单位的缓冲区大小。由于Short使用2个字节,因此您应该使用size *2作为缓冲区大小。

票数 1
EN

Stack Overflow用户

发布于 2014-02-17 19:10:50

在AudioTrack中,您使用的是AudioTrack.MODE_STATIC (用于具有低延迟要求的短声音),而您应该使用AudioTrack.MODE_STREAM,因为它适合于长缓冲区(不是很确切,但可能与3秒以内相关)。

看一看here : AudioTrack

只需将您的代码更改为:

代码语言:javascript
复制
AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC,
        samplerate,
        AudioFormat.CHANNEL_OUT_MONO,
        AudioFormat.ENCODING_PCM_16BIT,
        play.length,
        AudioTrack.MODE_STREAM);

它应该是有效的。

票数 1
EN

Stack Overflow用户

发布于 2012-10-11 12:43:37

我建议将播放长度与AudioTrack缓冲区大小解耦。根据我的经验,只要使用最小缓冲区大小,然后让较大的写入块完成,效果会很好。

我注意到的另一件事可能会影响到这一点,那就是音频只有在缓冲区的一半被填满时才会播放。在AudioTrack中的缓冲区如此之大,以至于它只是占用了这一半并试图解决它,这是可能的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11928123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档