这里有一个完整的例子可以帮助你入门
import java.io.*;
import java.util.Scanner;
import java.util.regex.Pattern;
class Test {
public static void main(String[] args) throws IOException {
ProcessBuilder pb = new ProcessBuilder("ffmpeg","-i","in.webm","out.mp4");
final Process p = pb.start();
new Thread() {
public void run() {
Scanner sc = new Scanner(p.getErrorStream());
Pattern durPattern = Pattern.compile("(?<=Duration: )[^,]*");
String dur = sc.findWithinHorizon(durPattern, 0);
if (dur == null)
throw new RuntimeException("Could not parse duration.");
String[] hms = dur.split(":");
double totalSecs = Integer.parseInt(hms[0]) * 3600
+ Integer.parseInt(hms[1]) * 60
+ Double.parseDouble(hms[2]);
System.out.println("Total duration: " + totalSecs + " seconds.");
Pattern timePattern = Pattern.compile("(?<=time=)[\\d.]*");
String match;
while (null != (match = sc.findWithinHorizon(timePattern, 0))) {
double progress = Double.parseDouble(match) / totalSecs;
System.out.printf("Progress: %.2f%%%n", progress * 100);
}
}
}.start();
}
}
输出:
Total duration: 117.7 seconds.
Progress: 7.71%
Progress: 16.40%
Progress: 25.00%
Progress: 33.16%
Progress: 42.67%
Progress: 51.35%
Progress: 60.57%
Progress: 69.07%
Progress: 78.02%
Progress: 86.49%
Progress: 95.94%
Progress: 99.97%
你还可以考虑使用一些类似jjmpeg这样的Java绑定程序来处理ffmpeg,这可能以更可靠的方式提供所需的内容。
编辑
使用ffmpeg 2.0时,时间输出为HH:mm:ss.S
,因此timePattern
需要包含一个:
。
Pattern timePattern = Pattern.compile("(?<=time=)[\\d:.]*")
此外,dur
需要按:
拆分并将其总和。
String[] matchSplit;
while (null != (match = sc.findWithinHorizon(timePattern, 0))) {
matchSplit = match.split(":")
double progress = Integer.parseInt(matchSplit[0]) * 3600 +
Integer.parseInt(matchSplit[1]) * 60 +
Double.parseDouble(matchSplit[2]) / totalSecs;
frame= 2822 fps=493 q=19.1 Lsize=4082kB time=117.66 bitrate= 284.2kbits/s
,从这一行中提取time=value,并通过公式(time/duration)*100
计算进度。 - shalki