Android: AudioTrack не воспроизводит полностью дорожку PCM при чтении 1024 байт за раз с помощью FileInputStream

Я хочу читать 1024 байта за раз с помощью FileInputStream и передавать буфер байтов в AudioTrack, который будет воспроизводить 1024 байта. Я поставил это цикл while, чтобы весь трек проигрывался непрерывно. Вы могли бы предложить прочитать весь PCM сразу, но я не хочу этого делать. Этот фрагмент кода воспроизводит только первые 1024 байта и после этого выходит из цикла.

                    fis = new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Notate/" + MainActivity.filepath);
l = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Notate/" + MainActivity.filepath);
                byte[] buffer = new byte[1024];
                try {
                    fis = new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Notate/" + MainActivity.filepath);


                    while (fis.read(buffer)!=-1) {

                    int intSize = android.media.AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_MONO,
                            AudioFormat.ENCODING_PCM_16BIT);
                    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO,
                            AudioFormat.ENCODING_PCM_16BIT, intSize, AudioTrack.MODE_STREAM);
                    TextView t1 = (TextView) contentView.findViewById(R.id.textView1);
                    t1.setText(Integer.toString(intSize));
                    if (at != null) {
                        at.play();
                        at.write(buffer, 0, buffer.length);
                        at.stop();
                        at.release();
                    }
                }
                    fis.close();
                } catch (Exception e) {
                }

person shivram    schedule 07.01.2015    source источник
comment
Сделайте отступ в коде, чтобы его можно было прочитать. Я вижу в вашем коде два блока try, но только один catch. Где другой? Кроме того, когда возникает исключение, вы можете захотеть, по крайней мере, зарегистрировать исключение, чтобы знать, что происходит.   -  person Michael    schedule 07.01.2015
comment
И вы пытаетесь создать новый AudioTrack для каждой итерации цикла while. Вы должны создать один AudioTrack перед циклом.   -  person Michael    schedule 07.01.2015
comment
И это решило проблему! Спасибо, Майкл!   -  person shivram    schedule 07.01.2015


Ответы (1)


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

из документов на чтение (байт [])...

Возвраты:

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

Но вы предполагаете, что был доставлен весь buffer.length?

Где тот случай, когда возвращаемое значение чтения равно NONEoF(-1, 1024)?

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

person Robert Rowntree    schedule 07.01.2015
comment
эй, Роберт, спасибо за ответ, Майкл решил проблему. Теперь это работает. - person shivram; 07.01.2015