Я являюсь tyring для слияния файла .mov с WAV-файлом с использованием java media framework, поэтому мне нужно знать их продолжительность. Как я могу это сделать? Любые идеи будут оценены ..Как узнать .wav-длительность в работе медиа-кадров Java?
ответ
вы можете узнать продолжительность звуковых файлов, используя этот способ (то есть второй способ 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();
}
}
}
Я не знаком с рамками Java Media, но, вероятно, следующие помогут:
1) Теоретически вы можете получить длительность файла WAV из «фактов» куска. Но я сомневаюсь, JMF дает прямой доступ к куску. Более того, кусок может содержать неправильное значение.
2) Вы можете рассчитать продолжительность, зная размер аудиоданных (в байтах) и частоту дискретизации (или битрейт).
Я попробовал принятый ответ, но после получения исключения с этим, я решил просто сделать это в простой способ.
Если у вас есть несколько основных частей информации, вы можете изобразить длину аудиоданных. Основные части являются:
- Частота дискретизации размер
- 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-файлами.
Вам понадобится подробное описание в решении от @ibrahimyilmaz, когда звук находится в сжатом формате. Например, если файл был в формате MP3, использование 'file.length()' было бы неправильной длиной для ссылки. – metasim
Не могли бы вы привести конкретный пример? – yasemin
Боюсь, я не уверен, что вы подразумеваете под «конкретным примером». Как я уже сказал, я не знаком с JMF. Кроме того, что касается пункта 1), вам просто нужно прочитать спецификации файлов RIFF-WAV. Что касается пункта 2: продолжительность (в секундах) = data_size/block_align/samplerate. То, что я хотел сказать, существует только два возможных общих метода определения продолжительности wav-файла без декомпрессии. – VitalyVal