Android AudioTrack щелкает в начале и в конце звука - PullRequest
3 голосов
/ 20 ноября 2011

Я получаю щелчки в начале и в конце воспроизведения звука (wav от sdcard). Это должно быть связано с буферизацией трека, но я не знаю решения. Кроме того, я создаю новый из них каждый раз, когда звучит звук, это нормально или есть лучший способ? Есть много звуков, играющих снова и снова. Вот код:

public void PlayAudioTrack(final String filePath, final Float f) throws IOException
    {

    new Thread(new Runnable() { public void run() { 
            //play sound here
        int minSize = AudioTrack.getMinBufferSize( 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT );        
           AudioTrack track = new AudioTrack( AudioManager.STREAM_MUSIC, 44100, 
             AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, 
             minSize, AudioTrack.MODE_STREAM);

        track.setPlaybackRate((int) (44100*f));

    if (filePath==null)
    return;

    int count = 512 * 1024; 
    //Read the file..
    byte[] byteData = null;
    File file = null;
    file = new File(filePath);

    byteData = new byte[(int)count];
    FileInputStream in = null;
    try {
    in = new FileInputStream( file );

    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    int bytesread = 0, ret = 0;
    int size = (int) file.length();

    while (bytesread < size) { 
    try {
        ret = in.read( byteData,0, count);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    track.play(); 
    if (ret != -1) { 
    // Write the byte array to the track 
    track.write(byteData,0, ret); bytesread += ret; 
    } 
    else break; } 

    try {
        in.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } track.stop(); track.release(); 
    }

        }).start();
        }

Большое спасибо за любую помощь

Ответы [ 2 ]

4 голосов
/ 19 мая 2014

Возможно ли, что вы играете также заголовок волнового файла PCM?

Каждый волновой файл PCM имеет небольшой заголовок в начале файла, если вы воспроизводите его, вы проигрываете байты заголовка, что может привести к щелчку в начале.

1 голос
/ 31 мая 2013

У меня были те же самые клики в начале каждого трека с использованием AudioTrack.Я решил это, выключив громкость трека, подождав полсекунды, а затем восстановив нормальную громкость.У меня больше нет кликов.Вот соответствующий бит кода.

    at.play();
    at.setStereoVolume (0.0f, 0.0f);

    new Thread (new Runnable(){
        public void run() {
            try{
                Thread.sleep(500);
            } catch (InterruptedException ie) { ; }
            at.setStereoVolume (1.0f, 1.0f);
        }
    }).start();

    new Thread (new Runnable(){
        public void run() {
            int i = 0;
            try{
                buffer = new byte[512];
                while(((i = is.read(buffer)) != -1) && !paused){
                    at.write(buffer, 0, i);
                    position += i;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (!paused){
                parent.trackEnded();
            }
        }
    }).start();
}
...