使用AudioTrack播放循环音频

Orb*_*bit 17 android audiotrack

我有一个功能,我想转换使用Androids AudioTrack而不是MediaPlayer,由于一些众所周知的错误MediaPlayer,例如循环轨道之间出现的小间隙.

我被推荐使用,AudioTrack但没有找到很多使用它的例子.我确实在SO上找到了一个关于AudioTrack并使用了一些代码来解决问题的问题:

public class TestActivity extends Activity implements Runnable {

    Button playButton;
    byte[] byteData = null;
    int bufSize;
    AudioTrack myAT = null;
    Thread playThread = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        playButton = (Button) findViewById(R.id.testButton);

        InputStream inputStream = getResources().openRawResource(R.raw.whitenoise_wav);
        try {
            byteData = new byte[ inputStream.available()];
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            inputStream.read(byteData);
            inputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        initialize();

        playButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                playThread.start();
            }
        });
    }

    void initialize() {

        bufSize = android.media.AudioTrack.getMinBufferSize(44100,
                AudioFormat.CHANNEL_CONFIGURATION_STEREO,
                AudioFormat.ENCODING_PCM_16BIT);

        myAT = new AudioTrack(AudioManager.STREAM_MUSIC,
                44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
                AudioFormat.ENCODING_PCM_16BIT, bufSize,
                AudioTrack.MODE_STREAM);
        myAT.setVolume(.2f);

        playThread = new Thread(this);
    }

    public void run() {
        if (myAT != null) {
            myAT.play();
            myAT.setLoopPoints(0, byteData.length, 6);
            myAT.write(byteData, 0, byteData.length);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以这似乎播放整个音轨(约1:00分钟),然后停止.现在最终目标是两个有2个单独的音轨同时播放和循环.我目前在/res/raw/目录中有音轨,但assets如果更好的话,我可以将它们移动到一个简单的文件夹中.我目前的实施AudioTrack是否正确?如果是这样,我将如何让它循环?

总结:如何在没有间隙的情况下播放循环音频AudioTrack

欢迎使用其他方法获取循环音频的建议,例如第三方库.

Mim*_*oli 7

您无法使用配置的AudioTrack循环AudioTrack.MODE_STREAM.如果您使用MODE_STREAMAudioTrack需要连续填充新样本.

但你可以配置它AudioTrack.MODE_STATIC并传递整个缓冲区来播放(我的意思是:如果你需要混合两个样本,你必须传递混合样本).

setLoopPoints:设置循环点和循环计数.循环可以是无限的.与setPlaybackHeadPosition类似,必须停止或暂停轨道才能更改循环点,并且必须使用MODE_STATIC模式.

请注意,AudioTrack播放原始PCM样本,不支持WAV,MP3或其他容器.