Dưới đây là một ví dụ hoàn chỉnh cho bạn mà nên giúp bạn bắt đầu
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());
// Find duration
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.");
// Find time as long as possible.
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();
}
}
Output:
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%
Bạn cũng có thể xem xét sử dụng một số loại bindings Java cho ffmpeg như jjmpeg mà có thể cung cấp những gì bạn cần theo cách mạnh mẽ hơn.
EDIT
Với ffmpeg 2.0, đầu ra thời gian là HH:mm:ss.S
nên timePattern
cần để kết hợp một :
Pattern timePattern = Pattern.compile("(?<=time=)[\\d:.]*");
Bên cạnh đó, dur
sẽ cần phải được chia trên :
và tóm tắt lại với nhau
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;
//...
tôi nhận được kết quả như 'khung = 2822 fps = 493 q = 19,1 Lsize = 4082kB time = 117,66 bitrate = 284.2kbits/s' cách chính xác làm bạn có kế hoạch để trích xuất các -progress%? – aioobe
xem trước hết nó cho biết Thời gian bắt đầu ... Tôi muốn đọc trước và chuyển đổi thành giây và lưu trữ rồi tất cả các dòng như 'frame = 2822 fps = 493 q = 19.1 Lsize = 4082kB time = 117.66 bitrate = 284.2kbits/s' và từ dòng này trích xuất giá trị time = và thông qua điều này tôi sẽ tìm tiến độ theo công thức '(thời gian/thời gian) * 100' – shalki
Tôi hiểu. Hãy để tôi thử :-) – aioobe