2010-12-13 15 views
8

AudioTrackの2つのインスタンスを同時に実行する必要があります。私はそれらを異なる可変サンプルレートで再生しているため、それらは別々に実行する必要があります。私は同じスレッドでそれらを実行すると、彼らは "順番に"を取ることがわかりました。私はそれぞれのスレッドでそれらを実行していますが、音声が吃音しています。Android:複数のAudioTrackインスタンスをミックスしていますか?

2つのインスタンスをうまく再生するためのアイデアはありますか?そうでない場合は、2つの短いバッファを1つにミックスするためのヒント。異なるサンプルレートでそれらを再生したい場合でも。

答えて

11

私は4つのaudioTracksを一度に再生しており、うまく再生されているようです。 HTC Desire 1.1ghz OCのテスト。私はときどきスレッディングで不具合を起こします。場合によっては、4つすべてが再生されている場合は、スレッドに参加しようとすると止まらないことがあります。より多くのテストを行う必要があります。 は、ここで指定したパス

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; 
} 

}

+0

おかげで録音したWAVファイルを再生するための私のクラスです!これを試みます。私はAudioTrackをあなたのようにスレッドコールバックに作成していません。私はそれが治療法であると推測しています(残りのコードは私のものとほとんど同じです)。これは、2つのAudioTrackの「トグル」がなぜお互いをブロックしているのかを説明します。 – BTR

+0

これがうまくいくかどうか教えてください。私はまた、このすべてを私のスレッド管理を行う別のクラスにラップしています。私はスレッドマネージャを呼び出すことができ、ストリームの記録や再生のためのスレッディングについて心配する必要はありません。 – DeliveryNinja

+2

それより少し多かったですが、本当の鍵はスレッド内にAudioTrackを作成していたことです。別の種類の「デバイス」クラスを持っていたので、テンポや音量などをコントロールすることができました。ファイルを読み込んで1つのスレッドですべて実行するクラスに結合すると、それらを素敵に再生できます。私のオプティマス(600mHz)でDJしています。 :) – BTR

関連する問題