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

Искам да прочета 1024 байта наведнъж с помощта на FileInputStream и да предам байтовия буфер на AudioTrack, който ще възпроизведе 1024 байта. Поставих това да е цикъл, така че цялата песен да се възпроизвежда непрекъснато. Може да предложите да прочетете целия 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)


Трябва да бъдете по-точни при отчитането на байтовете, действително произведени от четенето...

от документите на read(byte[])...

Връщане:

общият брой байтове, прочетени в буфера, или -1, ако няма повече данни, защото краят на файла е достигнат.

Но предполагате, че е доставен цял buffer.length?

Къде е случаят, когато върнатата стойност от прочетеното е NONEoF (-1, 1024)?

Трябва да вземете предвид този краен случай във вашия код, като напишете точно каква дължина е предоставена от предишното четене.

person Robert Rowntree    schedule 07.01.2015
comment
хей, Робърт, благодаря за отговора, Майкъл реши проблема. Сега работи. - person shivram; 07.01.2015