安卓:混合多个AudioTrack实例? [英] Android: Mixing multiple AudioTrack instances?

查看:534
本文介绍了安卓:混合多个AudioTrack实例?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要运行AudioTrack的两个实例在同一时间。他们必须单独运行,因为我打他们在不同的,可变的采样率。我发现,如果我在同一个线程中运行它们,轮流。我运行他们各自在自己的线程,但该音频口吃。

I need to run two instances of AudioTrack at the same time. They must run separately because I'm playing them at different, variable sample rates. I found that if I run them in the same thread, they "take turns". I'm running them each in their own thread, but the audio is stuttering.

这使得两种情况的任何想法发挥好?如果不是,在混合两种短缓冲区为一体,即使我想在不同的采样率,以发挥他们的任何提示。

Any ideas on making two instances play nice? If not, any tips on mixing two short buffers into one, even if I want to play them at different sample rates.

推荐答案

我有4个audioTracks玩一次,他们似乎能正常播放。在测试的HTC Desire 1.1GHz的超频。我得到毛刺的螺纹虽然有时。有时候如果四个正在演奏不会停止,当我试图加入的线程。需要做更多的测试。   下面是我班的播放记录在给定的路径WAV文件

I have 4 audioTracks playing at once and they seem to play fine. Testing on HTC Desire 1.1ghz OC. I get glitches with the threading sometimes though. Occasionally if all four are playing one will not stop when I try to join the thread. Need to do more testing. Here is my class for playing back a wav file recorded at a given path

    package com.ron.audio.functions;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;

public class AudioPlayManager implements Runnable {

private File fileName;
private volatile boolean playing;

public AudioPlayManager() {
    super();
    setPlaying(false);
}

public void run(){
      // Get the length of the audio stored in the file (16 bit so 2 bytes per short)
      // and create a short array to store the recorded audio.
      int musicLength = (int)(fileName.length()/2);
      short[] music = new short[musicLength];

      try {
        // Create a DataInputStream to read the audio data back from the saved file.
        InputStream is = new FileInputStream(fileName);
        BufferedInputStream bis = new BufferedInputStream(is);
        DataInputStream dis = new DataInputStream(bis);

        // Read the file into the music array.
        int i = 0;
        while (dis.available() > 0) {
          music[i] = dis.readShort();
          i++;
        }

        // Close the input streams.
        dis.close();     

        // Create a new AudioTrack object using the same parameters as the AudioRecord
        // object used to create the file.
        AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
                                                11025, 
                                               AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                               AudioFormat.ENCODING_PCM_16BIT, 
                                               musicLength, 
                                               AudioTrack.MODE_STREAM);
        // Start playback
        audioTrack.play();

        // Write the music buffer to the AudioTrack object
        while(playing){
            audioTrack.write(music, 0, musicLength);
        }

      }
      catch(Exception e){
          e.printStackTrace();
      }

}


public void setFileName(File fileName) {
    this.fileName = fileName;
}

public File getFileName() {
    return fileName;
}

public void setPlaying(boolean playing) {
    this.playing = playing;
}

public boolean isPlaying() {
    return playing;
}

}

这篇关于安卓:混合多个AudioTrack实例?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆