2012-03-22 3 views
0

Я пытаюсь получить амплитуду одного из mp3-файлов. Ниже приводится код:Почему FrameLength равно -1?

 AudioInputStream ain = AudioSystem.getAudioInputStream(file); 
     AudioFormat baseFormat = ain.getFormat(); 
     AudioFormat decodedFormat = new AudioFormat(
             AudioFormat.Encoding.PCM_SIGNED, 
             baseFormat.getSampleRate(), 
             16, 
             baseFormat.getChannels(), 
             baseFormat.getChannels()*2, 
             baseFormat.getSampleRate(), 
             false); 
     //play(file,din,decodedFormat,ain); 
     ain = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(file))); 
     DecodedMpegAudioInputStream decodedStream = new DecodedMpegAudioInputStream(decodedFormat, ain); 
     System.out.println(ain.getFrameLength()); 
     System.out.println(decodedStream.getFrameLength()); 

Проблема состоит в том, что последние printlns возвращаются -1 другими словами нет никакой информации о длине кадра в mp3 файл или аудиопоток не может прочитать длину кадра (это возможно ?). Я пытаюсь узнать о формате mp3 аудио файлов. Правильно ли я делаю это? ИЛИ есть ли другой способ получить длину кадра?

+0

Если вы расшифровали mp3 в сырой РСМ, то больше нет кадров , Фреймы - это концепция MPEG, которая не применяется к pcm –

+0

Спасибо Marc. Даже закодированный mp3-файл возвращает длину кадра как -1. Я положил первый println «System.out.println (ain.getFrameLength()); только для того, чтобы узнать, имеет ли кодированный файл какую-либо информацию о длине кадра или нет. –

ответ

0

Проверьте, если AudioSystem.getAudioFileFormat(file) является формат MPEG и запустить через его свойства

AudioFileFormat audioFileFormat = AudioSystem.getAudioFileFormat(file); 
if (audioFileFormat instanceof TAudioFileFormat) { 
    Map<String, Object> properties = ((TAudioFileFormat) audioFileFormat).properties(); 
// ... 
} 

Там это такие свойства, как mp3.length.bytes и может помочь

Смежные вопросы