Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android Audio Tack中写入缓冲区后,音频文件延迟播放_Java_Android_Audio_Buffer_Audiotrack - Fatal编程技术网

Java 在android Audio Tack中写入缓冲区后,音频文件延迟播放

Java 在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

当我增加缓冲区的大小时,写入缓冲区的音频会延迟播放。当我离散缓冲区的大小时,文件正确播放意味着文件会按时播放,而不是延迟播放。任何人都可以帮助。。。缓冲区大小为64k

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

请给出任何其他可能的原因。你能解释为什么我可以创建任何单独的线程来播放文件吗