Java 在android Audio Tack中写入缓冲区后,音频文件延迟播放
当我增加缓冲区的大小时,写入缓冲区的音频会延迟播放。当我离散缓冲区的大小时,文件正确播放意味着文件会按时播放,而不是延迟播放。任何人都可以帮助。。。缓冲区大小为64kJava 在android Audio Tack中写入缓冲区后,音频文件延迟播放,java,android,audio,buffer,audiotrack,Java,Android,Audio,Buffer,Audiotrack,当我增加缓冲区的大小时,写入缓冲区的音频会延迟播放。当我离散缓冲区的大小时,文件正确播放意味着文件会按时播放,而不是延迟播放。任何人都可以帮助。。。缓冲区大小为64k public class MediaSPK { private static final int RECORDER_SAMPLERATE = 16000; private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_OUT_MONO; p
public class MediaSPK
{
private static final int RECORDER_SAMPLERATE = 16000;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_OUT_MONO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
VaxSIPUserAgent m_objVaxSIPUserAgent;
boolean m_bMuteSpk = false;
boolean m_bPlay = false;
AudioTrack m_objAudioTrack = null;
public MediaSPK(VaxSIPUserAgent objVaxSIPUserAgent)
{
m_objVaxSIPUserAgent = objVaxSIPUserAgent;
}
public void OpenSpk()
{
int nMinBuffSize = AudioTrack.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
//Log.i("size SPK", "" + m_nMinBuffSize);
m_objAudioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, 64000, AudioTrack.MODE_STREAM);
m_objAudioTrack.play();
m_bPlay = false;
}
public void PlaySpk(byte[] aData, int nDataSize)
{
if(m_bMuteSpk)
{
byte[] aDataSilence = new byte[nDataSize];
m_objAudioTrack.write(aDataSilence, 0, nDataSize);
}
else
{
m_objAudioTrack.write(aData, 0, nDataSize);
}
}
public void Mute(boolean bEnable)
{
//m_bMuteSpk = bEnable;
//m_objAudioTrack
}
public void CloseSpk()
{
if(m_objAudioTrack == null)
return;
try
{
m_objAudioTrack.stop();
m_objAudioTrack.release();
m_objAudioTrack = null;
}
catch (IllegalStateException e)
{
e.printStackTrace();
}
}
}
可能是您将整个操作放在一个线程上,尝试将操作拆分为单独的线程,使用
Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable(), delay);
请给出任何其他可能的原因。你能解释为什么我可以创建任何单独的线程来播放文件吗