AudioFlinger 无法创建音轨,状态:-22 和采样率超出范围:441000 mSampleRate 44100

AudioFlinger could not create track, status: -22 and Sample rate out of range: 441000 mSampleRate 44100

我正在制作一个鼓垫应用程序,其中包括播放很多 (8) 个 .wav files.I 尝试使用 soundpool 播放小型 .wav 文件,据我所知,soundpool 用于播放小型文件 files.But 当我尝试播放上述错误时,我 way.I 是 android 编程的初学者。感谢帮助。

我的logcat抛出

12-30 17:33:03.825 166-488/? E/AudioFlinger: Sample rate out of range: 441000 mSampleRate 44100
12-30 17:33:03.825 1627-1627/com.govinddixit.drumpadchamp E/AudioTrack: AudioFlinger could not create track, status: -22
12-30 17:33:03.825 1627-1627/com.govinddixit.drumpadchamp E/SoundPool: Error creating AudioTrack

java主要activity

package com.govinddixit.drumpadchamp;

import android.media.AudioManager;
import android.media.SoundPool;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {
     SoundPool sp;
    private int sound1;
    private int sound2;
    private int sound3;
    private int sound4;
    private int sound5;
    private int sound6;
    private int sound7;
    private int sound8;
    private int sound9;
    private int sound00;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sp = new SoundPool(2, AudioManager.STREAM_MUSIC,0);
        sound1 = sp.load(getApplicationContext(),R.raw.sound1,1);
        sound2 = sp.load(getApplicationContext(),R.raw.sound2,1);
        sound3 = sp.load(getApplicationContext(),R.raw.sound3,1);
        sound4 = sp.load(getApplicationContext(),R.raw.sound4,1);
        sound5 = sp.load(getApplicationContext(),R.raw.sound5,1);
        sound6 = sp.load(getApplicationContext(),R.raw.sound6,1);
        sound7 = sp.load(getApplicationContext(),R.raw.sound7,1);
        sound8 = sp.load(getApplicationContext(),R.raw.sound8,1);
        sound9 = sp.load(getApplicationContext(),R.raw.sound9,1);
        sound00 = sp.load(getApplicationContext(),R.raw.sound00,1);

    }

    public void playsound1 (View v) {
        sp.play(sound1,1.0f,1.0f,0,0,10f);
    }
    public void playsound2 (View v) {
        sp.play(sound2,1.0f,1.0f,0,0,10f);

    }
    public void playsound3 (View v) {
        sp.play(sound3,1.0f,1.0f,0,0,10f);

    }
    public void playsound4 (View v) {
        sp.play(sound4,1.0f,1.0f,0,0,10f);

    }
    public void playsound5 (View v) {
        sp.play(sound5,1.0f,1.0f,0,0,10f);

    }
    public void playsound6 (View v) {
        sp.play(sound6,1.0f,1.0f,0,0,10f);

    }
    public void playsound7 (View v) {
        sp.play(sound7,1.0f,1.0f,0,0,10f);

    }
    public void playsound8 (View v) {
        sp.play(sound8,1.0f,1.0f,0,0,10f);

    }
    public void playsound9 (View v) {
        sp.play(sound9,1.0f,1.0f,0,0,10f);

    }
}

首先,在下面的代码摘录中增加 maxStreams 参数或您的应用可以同时播放的最大声音数,以在您的应用用户按下超过 2 个按钮时启用多个流的播放垫子:

sp = new SoundPool(9, AudioManager.STREAM_MUSIC,0); 

用9代替2。九(9)是maxStreams参数或者一个soundPool中可以同时播放的音频流的数量。虽然您不太可能同时按下 9 个打击垫,但最好将 maxStreams 设置为等于您应用程序上的按钮或打击垫的数量。

但这不是错误的原因。该错误是由播放速率的 10f 值非常高引起的。播放速率的范围是从 0.5 到 2.0,不多也不少。播放速率的默认值应为 1.0f。如果你想改变声音的速度和音调,那么你可以使用 0.5 到 2.0 之间的值。在下面查看具有正确播放率的第一种方法:

public void playsound1 (View v) {
        sp.play(sound1, 1.0f, 1.0f, 0, 0, 1.0f);
    }

当我设置不同的值时,我遇到了同样的问题,这些值是我为我用来编程和构建我的弦乐和钢琴音乐键盘应用程序的半音音阶而导出的播放速率,其中参考键是 C4我的键盘布局上没有显示八度,C4 的音频流被加载到 B3 键以供参考。我设法通过使用 C3 作为参考音符解决了这个问题,并且通常应用 G3# 的频率比因子 1.6667f。我不会详细讨论数学,因为您的应用程序错误的原因更简单并且与我所经历的不同。

希望以上解决方案能解决您的问题。