Android Java: декодиране на mp3 файл и предаване на данни в кратък [] масив за анализ

Правя проект, в който ще декодирам данни от mp3 файл директно и ще съхранявам получените pcm данни във временна папка, temp.pcm в sdcard за по-късен анализ. Имам проблем с декодирането на данните...

        //a short array to store raw pcm data
        short[] buffer = new short[bufferSize];

        ByteArrayOutputStream outStream = new ByteArrayOutputStream(1024);
        File filep = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/onenineoone.mp3");

        InputStream inputStream = new BufferedInputStream(new FileInputStream(filep), 8 * 1024);
        short[] pcm=null;

        try
        {
            Bitstream bitstream = new Bitstream(inputStream);
            boolean done = false;

            while (!done)
            {

                javazoom.jl.decoder.Header frameHeader = bitstream.readFrame();
                javazoom.jl.decoder.Decoder decoder = new javazoom.jl.decoder.Decoder;

                SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream);
                ****Log.i("decoder", "error in the samplebuffer??");****
                if (output.getSampleFrequency() != 44100 || output.getChannelCount() != 1) throw new DecoderException("Stereo or non-44100 sampling rate .mp3 not supported", null);
                    pcm = output.getBuffer();

                for (short s:pcm) {
                   outStream.write(s);
                 }
                buffer=pcm;
            }    
            done = true;
            bitstream.closeFrame();

        }   catch (BitstreamException e) {
            throw new IOException("Bitstream error: " + e);
        }   catch (DecoderException e) {
               Log.w("error is:", "Decoder error", e);
        }

**РЕШЕНО
Декларирах частен декодер javazoom.jl.decoder.Decoder като глобален ключ, но изглежда, че грешката, поради която не влиза в SampleBuffer, е че трябваше да го декларирам като javazoom.jl.decoder.Decoder decoder = нов javazoom.jl.decoder.Decoder.


person Jeany    schedule 02.07.2014    source източник


Отговори (1)


Няма смисъл (за мен) да отварям два пъти InputStream на File filep. Дори не затваряте първия поток, преди да отворите втория. Моля, първо адаптирайте този код.

person greenapps    schedule 02.07.2014
comment
Добре, така че премахнах InputStream е; и заобикалящия блок за опит/хващане. Редът за кодовете на SampleBuffer все още не се изпълнява. - person Jeany; 02.07.2014
comment
Не казахте откъде имате основния код. Моля, дайте линк към примери. Има няколко публикации на този сайт за почти същия проблем. Знаете ли този, където отварят входния поток по различен начин: stackoverflow.com/questions/13959599/ - person greenapps; 02.07.2014
comment
Прочетох почти всички свързани въпроси, изглежда, че е грешка от моя страна. Вече редактирах кода. Съжалявам :X и ви благодаря за отделеното време!! - person Jeany; 02.07.2014