Android: воспроизведение звукового файла WAV большего размера приводит к сбою - PullRequest
2 голосов
/ 25 марта 2010

Я пытаюсь воспроизвести звуковой файл WAV большего размера (который составляет> 20 МБ) , используя следующий код (AudioTrack) на моем устройстве Android 1.6 HTC , которое в основном имеет меньше памяти . Но я обнаружил сбой устройства, как только он выполняет чтение, запись и воспроизведение. Но тот же код прекрасно работает и очень хорошо воспроизводит * wav-файлы меньшего размера (файлы 10 КБ, 20 КБ и т. Д.) . P.S .: Я должен воспроизвести звук буфера PCM (.wav) , причина, по которой я здесь использую AudioTrack.

Несмотря на то, что у моего устройства меньше памяти, как бы я считывал байты байтовых аудиофайлов большего размера и воспроизводил звук, чтобы избежать сбоев из-за ограничений памяти.

private void AudioTrackPlayPCM() throws IOException
{
    String filePath = "/sdcard/myWav.wav"; // 8 kb file

    byte[] byteData = null;             
    File file = null; 

    file = new File(filePath);

    byteData = new byte[(int) file.length()];

    FileInputStream in = null;

    try {
        in = new FileInputStream( file );
        in.read( byteData );
        in.close(); 
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    int intSize = android.media.AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
    AudioFormat.ENCODING_PCM_8BIT);     

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
    AudioFormat.ENCODING_PCM_8BIT, intSize, AudioTrack.MODE_STREAM);        

    at.play();

    at.write(byteData, 0, byteData.length);         
    at.stop();

    at.release();
}

Может кто-нибудь подсказать мне, пожалуйста, воспроизвести код AudioTrack для wav-файлов большего размера?

1 Ответ

0 голосов
/ 26 марта 2010

Ваш intSize будет минимальным размером буфера, необходимым для запуска AudioTrack, попробуйте использовать его несколько, чтобы создать больший буфер

AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_8BIT, intSize*10, 
AudioTrack.MODE_STREAM); 
...