2010-04-25 5 views

ответ

6

вы можете узнать продолжительность звуковых файлов, используя этот способ (то есть второй способ VitalyVal в):

import java.net.URL; 

     import javax.sound.sampled.AudioFormat; 
     import javax.sound.sampled.AudioInputStream; 
     import javax.sound.sampled.AudioSystem; 
     import javax.sound.sampled.Clip; 
     import javax.sound.sampled.DataLine; 

     public class SoundUtils { 
      public static double getLength(String path) throws Exception { 
       AudioInputStream stream; 
       stream = AudioSystem.getAudioInputStream(new URL(path)); 
       AudioFormat format = stream.getFormat(); 
       if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) { 
        format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, format 
          .getSampleRate(), format.getSampleSizeInBits() * 2, format 
          .getChannels(), format.getFrameSize() * 2, format 
          .getFrameRate(), true); // big endian 
        stream = AudioSystem.getAudioInputStream(format, stream); 
       } 
       DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat(), 
         ((int) stream.getFrameLength() * format.getFrameSize())); 
       Clip clip = (Clip) AudioSystem.getLine(info); 
       clip.close(); 
       return clip.getBufferSize() 
         /(clip.getFormat().getFrameSize() * clip.getFormat() 
           .getFrameRate()); 
      } 

      public static void main(String[] args) { 
       try { 

        System.out 
          .println(getLength("...")); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

     } 
1

Я не знаком с рамками Java Media, но, вероятно, следующие помогут:

1) Теоретически вы можете получить длительность файла WAV из «фактов» куска. Но я сомневаюсь, JMF дает прямой доступ к куску. Более того, кусок может содержать неправильное значение.

2) Вы можете рассчитать продолжительность, зная размер аудиоданных (в байтах) и частоту дискретизации (или битрейт).

+0

Не могли бы вы привести конкретный пример? – yasemin

+1

Боюсь, я не уверен, что вы подразумеваете под «конкретным примером». Как я уже сказал, я не знаком с JMF. Кроме того, что касается пункта 1), вам просто нужно прочитать спецификации файлов RIFF-WAV. Что касается пункта 2: продолжительность (в секундах) = data_size/block_align/samplerate. То, что я хотел сказать, существует только два возможных общих метода определения продолжительности wav-файла без декомпрессии. – VitalyVal

4

Я попробовал принятый ответ, но после получения исключения с этим, я решил просто сделать это в простой способ.

Если у вас есть несколько основных частей информации, вы можете изобразить длину аудиоданных. Основные части являются:

  • Частота дискретизации размер
  • Sample (бит на выборку)
  • Размер файла
  • Количество каналов (моно/стерео)

Если у вас есть эти, вы можете узнать продолжительность. Java хорош, потому что он предоставляет библиотекам возможность легко извлекать всю эту информацию с минимальными усилиями. Уравнение ниже:

частоты дискретизация * размер выборки * длительность * многоканальные = размер файл

Смотрите ниже код, который делает этот расчет в Java:

public static double getDurationOfWavInSeconds(File file) 
{ 
    AudioInputStream stream = null; 

    try 
    { 
     stream = AudioSystem.getAudioInputStream(file); 

     AudioFormat format = stream.getFormat(); 

     return file.length()/format.getSampleRate()/(format.getSampleSizeInBits()/8.0)/format.getChannels(); 
    } 
    catch (Exception e) 
    { 
     // log an error 
     return -1; 
    } 
    finally 
    { 
     try { stream.close(); } catch (Exception ex) { } 
    } 
} 

Надеется, что это помогает кто-то там! Тем не менее, я тестировал его только с WAV-файлами.

+0

Вам понадобится подробное описание в решении от @ibrahimyilmaz, когда звук находится в сжатом формате. Например, если файл был в формате MP3, использование 'file.length()' было бы неправильной длиной для ссылки. – metasim