異なるフォーマット間でオーディオ ファイルを変換しても、オーディオ ファイルの合計再生時間に違いはないと思います。
たとえば、合計時間が 2 秒間の wave ファイルを記録すると、そのサイズは 20.3 MB になります。ffmpeg の最新ビルドを使用して、この wave ファイルを mp3 ファイルに変換すると、サイズは 1.35 mb になります。以下のコードを使用して、同じ変換された MP3 ファイルの継続時間を取得します。
public static String getDurationWithMp3Spi(File file)
throws UnsupportedAudioFileException, IOException, Exception {
AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file);
System.out.println(" File for duration MP3 " + file.getAbsolutePath());
if (fileFormat instanceof TAudioFileFormat) {
Map<?, ?> properties = ((TAudioFileFormat) fileFormat).properties();
String key = "duration";
Long microseconds = (Long) properties.get(key);
int mili = (int) (microseconds / 1000);
int sec = (mili / 1000) % 60;
int min = (mili / 1000) / 60;
String mp3Len = null;
String mins = null;
String secs = null;
if (min == 0) {
mins = "00";
}
if (min < 10) {
mins = "0" + min;
}else{
mins = "" + min;
}
if (sec == 0) {
secs = "00";
}
if (sec < 10) {
secs = "0" + sec;
}else{
secs = ""+secs;
}
mp3Len = mins + ":" + secs;
System.out.println("time = " + min + ":" + sec);
return mp3Len;
} else {
throw new UnsupportedAudioFileException();
}
}
Windows Media Player やその他のプレーヤーで見ると、元の wave と同じ期間が表示されますが、この方法で取得すると、元のものとは異なり、違いは非常に大きくなります。
音声ファイルを WAVE から MP3 に変換した場合、またはその逆に変換した場合、オーディオ ファイルの継続時間に違いはありますか?
助けてください。上記のコードはMP3SPIプラグインを使用しています。
上記のメソッドは変換を行い、期間を取得します。
for (Iterator<FileItem> fileIter = fileList.iterator(); fileIter
.hasNext();) {
FileItem fileItem = fileIter.next();
// write file to disk to specified path
if (!fileItem.isFormField()) {
String fileName = fileItem.getName();
System.out.println(" file Name " + fileName);
// save file to desired destination
waveFileSavePath = processFolderAppendee(waveFileSavePath,
fileName);
File waveFile = new File(waveFileSavePath);
fileItem.write(waveFile);
Thread.sleep(100);
// do conversion
String mp3FileName = fileName.replace("wav", "mp3");
mp3Path = mp3Path + "/" + mp3FileName;
convertToMP3(servletContext, waveFileSavePath, mp3Path);
Thread.sleep(100);
// prepare data(s)
GuestMessagesForm guestMessageForm = prepareGuestMessageData(
accountId, waveFileSavePath, mp3Path);
PlayListMessagesForm playListMessageForm = preparePlayListMessageData(accountId);
// save data(s)
// このメソッドは期間を呼び出します saveGuestMessage(guestMessageForm); savePlayListMessage(playListMessageForm);
} else {
// do nothing
}
waveFileSavePath = servletContext.getRealPath(recordDir);
}