FFmpeg是一个很好用的开源的视频处理工具,网上也有一些java调用FFmpeg的方法,然而这些文章大部分都有一个共同的特点,就是用java去调用FFmpeg去做视频处理,几乎没有去做录制视频和音频的,这些文章都巧妙的回避了一个问题,就是:如何能在java中正确关闭FFmpeg线程
要在java中调用FFmpeg,无非是用java启动一个cmd命令的线程,俗话说请神容易送神难,这个cmd线程打开是很容易的,然而关闭却很难,这个线程如果不能正确关闭,就会使FFmpeg之前录制的视频全部无法正确保存,或者视频格式出现异常,无法播放。本人查阅了大量的国内论坛,没找到解决方案,也查看了很多国外的提问的帖子,至今也未能解决,本人经过反反复复尝试,研究,终于解决此问题,现分享给大家
整个实现过程如下:
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
public class TestConsole {
private Runtime runtime;
private Process pro;
private void exec(String cmd) {
try {
System.out.println("系统开始执行命令:n" + cmd);
runtime = Runtime.getRuntime();
pro = runtime.exec(cmd);
InputStream stream = pro.getErrorStream();
output(stream);
pro.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
public void stop() throws IOException {
OutputStream ostream = pro.getOutputStream();
ostream.write("qrn".getBytes());
ostream.flush();
ostream.close();
}
public void output(InputStream stream) {
InputStreamReader isr = null;
BufferedReader br = null;
try {
isr = new InputStreamReader(stream, "gbk");
br = new BufferedReader(isr);
String str;
// 通过readLine()方法按行读取字符串
while ((str = br.readLine()) != null) {
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
close(br, isr, stream);
}
}
public void close(AutoCloseable ... acs) {
for(AutoCloseable ac : acs) {
try {
ac.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
TestConsole console = new TestConsole();
String cmd = "ffmpeg.exe -f gdigrab -offset_x 42 -offset_y 325 -video_size 1196x900 -i desktop -f dshow -i audio="virtual-audio-capturer" -vcodec libx264 -pix_fmt yuv420p C:\Users\lv-wang\Desktop\测试录屏\ii.mp4";
new Thread(()->console.exec(cmd)).start();
Thread.sleep(1000*10);
console.stop();
System.out.println("已经停止");
Thread.sleep(1000*5);
}
}



