【问题标题】:How to use AudioTrack in static mode如何在静态模式下使用 AudioTrack
【发布时间】:2021-03-24 16:37:15
【问题描述】:

我想在 Android 上播放浮点数组。我想先走(我认为是)简单的方法,所以我想我会使用 AudioTrack。我选择使用静态模式是因为音频流不连续。在文档中它说:

在静态缓冲区模式下,将数据从偏移量 0 开始复制到缓冲区,写入模式被忽略。请注意,此数据的实际播放可能会在此函数返回后发生。

所以最初我的实现看起来像:

// constructor ..
audioTrack = new AudioTrack(new AudioAttributes.Builder()
                            .setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
                            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).build(),
                                    new AudioFormat.Builder()
                            .setEncoding(AudioFormat.ENCODING_PCM_FLOAT)
                            .setSampleRate(sample_rate)
                            .setChannelMask(AudioFormat.CHANNEL_OUT_STEREO).build(),
                sample_rate * 2 * 10, AudioTrack.MODE_STATIC, AudioManager.AUDIO_SESSION_ID_GENERATE);
[...]
public ... () { // function
    audioTrack.write(sound, 0, sound.length, AudioTrack.WRITE_NON_BLOCKING);
    audioTrack.play()

这导致了第一个问题,声音只能播放一次。我found 我需要在play() 之后调用stop()reloadStaticData()。但这会导致根本不播放第一个声音。并且任何以下声音都将播放错误(意味着声音错误)。

我尝试将stop()reloadStaticData() 放在write() 之后和play() 之前,然后播放第一个声音,但下一个声音错误(它们是第一个声音的截断版本而不是不同的声音)。

根据这些经验,在我看来 write() 实际上并没有写入缓冲区的开头。一般来说,我完全不清楚如何使用AudioTrackstop() 似乎停止播放。但是我必须在play()之后调用它来重置播放头位置。

【问题讨论】:

    标签: android audiotrack


    【解决方案1】:

    原来我的手机扬声器无法播放声音......这是我的解决方案

    public void play_sound(float[] sound) {
            if (audioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
                audioTrack.stop();
                audioTrack.reloadStaticData();
            }
    
            float[] buffer = new float[buffer_size_in_bytes / 4];
            for (int i = 0; i < sound.length; i++) {
                buffer[i] = sound[i];
            }
            // Last arg is ignored.
            audioTrack.write(buffer, 0, buffer.length, AudioTrack.WRITE_BLOCKING);
            audioTrack.play();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-01
      • 2017-01-08
      • 1970-01-01
      • 2019-03-14
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多