Android版的Java:解码MP3文件,并通过数据成短[]数组分析数组、文件、数据、Android

2023-09-07 09:53:43 作者:指尖划过悲凉

我在做一个项目,我会从MP3文件直接去code数据,并获得到一个临时文件夹中的PCM数据,temp.pcm存储在SD卡供以后分析。我有麻烦解码数据....

I'm doing a project where I'll decode data from a mp3 file directly and store the pcm data obtained into a temporary folder, temp.pcm in the sdcard for later analysis. I'm having trouble decoding the data....

        //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);
        }

**解决 的结果我声明为private javazoom.jl.de coder.De codeR德codeR作为一个全球性的关键,但似乎它为什么不会进入SampleBuffer错误的是,我不得不将其声明为javazoom .jl.de coder.De codeR德codeR =新javazoom.jl.de coder.De codeR。

**SOLVED I declared private javazoom.jl.decoder.Decoder decoder as a global key, but it seems that the error why it would not enter the SampleBuffer is that I had to declare it as javazoom.jl.decoder.Decoder decoder = new javazoom.jl.decoder.Decoder.

推荐答案

这没有任何意义(对我来说)打开上的文件fil​​ep两次的InputStream。你是不是即使在关闭第一个流打开前一秒。请首先适应了code。

It does not make sense (to me) to open twice an InputStream on File filep. You are not even closing the first stream before you open the second. Please adapt that code first.