AudioUtil.java :
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.SAXException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author avb
*/
public class AudioUtil {
private static final long NANOS_IN_A_MILLISECOND = 1000000L;
public static Duration getDuration(File audioFile) throws IOException, TikaException, SAXException {
try (FileInputStream fileInputStream = new FileInputStream(audioFile)) {
Metadata metadata = new Metadata();
new AutoDetectParser().parse(fileInputStream, new BodyContentHandler(), metadata, new ParseContext());
String s = metadata.get("xmpDM:duration");
if (s != null && !s.isEmpty()) {
long durationNanos = (long) (Double.parseDouble(s) * NANOS_IN_A_MILLISECOND);
return Duration.of(durationNanos);
}
}
return Duration.of(0);
}
public static void main(String[] args) throws TikaException, IOException, SAXException {
System.out.println("Duration : " + AudioUtil.getDuration(new File("file.mp3")));
}
}
Duration.java :
import java.util.concurrent.TimeUnit;
/**
* @author avb
*/
public class Duration {
private long totalDurationNanos;
private long hours;
private long minutes;
private long seconds;
private long millis;
private long nanos;
public Duration(long totalDurationNanos) {
this.totalDurationNanos = totalDurationNanos;
hours = TimeUnit.NANOSECONDS.toHours(totalDurationNanos);
totalDurationNanos -= TimeUnit.HOURS.toNanos(hours);
minutes = TimeUnit.NANOSECONDS.toMinutes(totalDurationNanos) ;
totalDurationNanos -= TimeUnit.MINUTES.toNanos(minutes);
seconds = TimeUnit.NANOSECONDS.toSeconds(totalDurationNanos) ;
totalDurationNanos -= TimeUnit.SECONDS.toNanos(seconds);
millis = TimeUnit.NANOSECONDS.toMillis(totalDurationNanos);
totalDurationNanos -= TimeUnit.MILLISECONDS.toNanos(millis);
nanos = totalDurationNanos;
}
public Duration(long hours, long minutes, long seconds, long millis, long nanos) {
this(toNanos(hours, minutes, seconds, millis, nanos), hours, minutes, seconds, millis, nanos);
}
private Duration(long totalDurationNanos, long hours, long minutes, long seconds, long millis, long nanos) {
this.totalDurationNanos = totalDurationNanos;
this.hours = hours;
this.minutes = minutes;
this.seconds = seconds;
this.millis = millis;
this.nanos = nanos;
}
public static Duration of(long totalDurationNanos) {
return new Duration(totalDurationNanos);
}
private static long toNanos(long hours, long minutes, long seconds, long millis, long nanos) {
if (minutes >= 60 || seconds >= 60) {
throw new IllegalArgumentException();
}
return TimeUnit.HOURS.toNanos(hours)
+ TimeUnit.MINUTES.toNanos(minutes)
+ TimeUnit.SECONDS.toNanos(seconds)
+ TimeUnit.MILLISECONDS.toNanos(millis)
+ TimeUnit.NANOSECONDS.toNanos(nanos);
}
public long getTotalDurationNanos() {
return totalDurationNanos;
}
public void setTotalDurationNanos(long totalDurationNanos) {
this.totalDurationNanos = totalDurationNanos;
}
public long getHours() {
return hours;
}
public void setHours(long hours) {
this.hours = hours;
}
public long getMinutes() {
return minutes;
}
public void setMinutes(long minutes) {
this.minutes = minutes;
}
public long getSeconds() {
return seconds;
}
public void setSeconds(long seconds) {
this.seconds = seconds;
}
public long getMillis() {
return millis;
}
public void setMillis(long millis) {
this.millis = millis;
}
public long getNanos() {
return nanos;
}
public void setNanos(long nanos) {
this.nanos = nanos;
}
@Override
public String toString() {
return String.format("%02d:%02d:%02d.%03d", hours, minutes, seconds, millis);
}
}
http://mvnrepository.com/artifact/or.../tika-core/1.8
http://mvnrepository.com/artifact/or...ka-parsers/1.8