前提需要电脑上先安装后ffmpeg
public long parseDuration(String audioPath) {long durationMs = -1;try {Process process = Runtime.getRuntime().exec("ffprobe " + audioPath);// InputStream is = process.getInputStream();InputStream is = process.getErrorStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);String line;while ((line = br.readLine()) != null) {if (line.contains("Duration")) {// System.out.println("duration line1 = " + line);String duration = line.split(",")[0].trim();// System.out.println("duration line2 = " + duration);String[] parsedDurationArray = duration.split(":");// System.out.println("array len = " + parsedDurationArray.length);int hour = Integer.parseInt(parsedDurationArray[1].trim());int min = Integer.parseInt(parsedDurationArray[2].trim());float sec = Float.parseFloat(parsedDurationArray[3].trim());// System.out.println("duration line3: hour = " + hour);// System.out.println("duration line3: min = " + min);// System.out.println("duration line3: sec = " + sec);durationMs = (long)(hour * 3600 * 1000 + min * 60 * 1000 + sec * 1000);// System.out.println("duration line4: ms = " + durationMs);}}br.close();process.waitFor();int exitCode = process.exitValue();// System.out.println("exitCode: " + exitCode);process.destroy();} catch (IOException e) {throw new RuntimeException(e);} catch (InterruptedException e) {throw new RuntimeException(e);}return durationMs;}
二、 一个看起来更好的方法
private long parseMediaDuration(String mediaPath) throws IOException {// 假设用 ffprobe 获取时长ProcessBuilder pb = new ProcessBuilder("ffprobe", "-v", "error", "-show_entries","format=duration", "-of", "default=noprint_wrappers=1:nokey=1", mediaPath);Process process = pb.start();BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String duration = reader.readLine(); // duration in secondsdouble durationInSeconds = Double.parseDouble(duration);long durationInMicroseconds = (long)(durationInSeconds * 1000000);reader.close();try {process.waitFor();} catch (InterruptedException e) {throw new RuntimeException("ffprobe interrupted", e);}return durationInMicroseconds;}