I am using AudioTrack class to play large mp3 files. Actually i want to 
manipulate voice on fly like changing the pitch or speed 1x 2x etc.
As soundtrack works only for short files. So i found AudioTrack the only 
option. 

I am using JLayer to decode my mp3 file (stored on sdcard) to PCM byte 
array. 
Following is the code for Decoder function:

 public static byte[] decode(String path, int startMs, int maxMs)  throws 
> IOException, DecoderException 
> {
> ByteArrayOutputStream outStream = new ByteArrayOutputStream(1024);
> float totalMs = 0;
> boolean seeking = true;
> File file = new File(path);
> InputStream inputStream = new BufferedInputStream(new 
> FileInputStream(file), 8 * 1024);
> try
> {
>     Bitstream bitstream = new Bitstream(inputStream);
>     Decoder decoder = new Decoder();
>     boolean done = false;
>     while (! done)
>     {
>       javazoom.jl.decoder.Header frameHeader = bitstream.readFrame();
>       if (frameHeader == null)
>         done = true;
>       else
>       {
>         totalMs += frameHeader.ms_per_frame();
>         if (totalMs >= startMs)
>          seeking = false;
>         if (! seeking)
>         {
>           SampleBuffer output = (SampleBuffer) 
> decoder.decodeFrame(frameHeader, bitstream);
>                       if (output.getSampleFrequency() != 44100 || 
> output.getChannelCount() != 2)
>                 throw new DecoderException("mono or non-44100 MP3 not 
> supported", null);
>           short[] pcm = output.getBuffer();
>           for (short s : pcm)
>           {
>             outStream.write(s & 0xff);
>             outStream.write((s >> 8 ) & 0xff);
>           }
>         }
>         if (totalMs >= (startMs + maxMs))
>           done = true;
>       }
>       bitstream.closeFrame();
>     }
> return outStream.toByteArray();
>    }
>    catch (BitstreamException e)
>    {
>     throw new IOException("Bitstream error: " + e);
>    } 
>    catch (DecoderException e) 
>    {
>    Log.w("error is:", "Decoder error", e);
>        }
> return null;
> }


So i pass like this

buffer = decode(Environment.getExternalStorageDirectory()+"/cm.mp3", 
> i,i+1000);


But this is taking so long. Even if i pass max size to 15 seconds. it takes 
about 1 min to load into buffer. Is there any other mp3 decoder 
avaialable.? faster than this.

What are other ways? can i just stream large audio file to SOUNDPOOL?

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to