Android Java: декодирование mp3-файла и передача данных в массив short[] для анализа

Я делаю проект, в котором я буду декодировать данные из mp3-файла напрямую и хранить полученные данные PCM во временной папке temp.pcm на SD-карте для последующего анализа. У меня проблемы с расшифровкой данных....

        //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 = new javazoom.jl.decoder.Decoder.


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


Ответы (1)


Для меня не имеет смысла дважды открывать InputStream в файле filep. Вы даже не закрываете первый поток, пока не откроете второй. Сначала адаптируйте этот код.

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