package com.dji.sample.component.live;
|
|
import java.io.BufferedInputStream;
|
import java.io.BufferedReader;
|
import java.io.InputStreamReader;
|
import java.lang.management.ManagementFactory;
|
import java.lang.management.RuntimeMXBean;
|
import java.lang.reflect.Field;
|
|
public class FFMpeg extends Thread{
|
private String ffmpegCmd = "";
|
private int flag = 1;
|
|
public String getFfmpegCmd(){
|
return this.ffmpegCmd;
|
}
|
|
public void setFfmpegCmd(String ffmpegCmd){
|
this.ffmpegCmd = ffmpegCmd;
|
}
|
|
public void run(){
|
openFFmpegExe();
|
System.out.println("执行完成准备退出");
|
}
|
// taskkill /F /T /IM "ffmpeg.exe"
|
private void openFFmpegExe() {
|
if(ffmpegCmd==null||ffmpegCmd.equals("")){
|
return;
|
}
|
// Runtime rn = Runtime.getRuntime();
|
Process p = null;
|
ProcessBuilder processBuilder = new ProcessBuilder();
|
processBuilder.command("bash", "-c", ffmpegCmd);
|
processBuilder.redirectErrorStream(true);
|
try{
|
//传递ffmpeg推流命令行
|
// p = rn.exec(ffmpegCmd);
|
p = processBuilder.start();
|
// Field field = p.getClass().getDeclaredField("handle");
|
// field.setAccessible(true);
|
// Long aLong = (Long) field.get(p);
|
// System.out.println("aLong " + aLong);
|
// RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
|
// String name = runtime.getName(); // format: "pid@hostname"
|
// Integer pid = Integer.parseInt(name.substring(0, name.indexOf('@')));
|
// System.out.println(name+pid);
|
//ffmpeg输出的都是“错误流”,stdin,stdout,stderm
|
// BufferedInputStream in = new BufferedInputStream(p.getErrorStream());
|
// BufferedInputStream in = new BufferedInputStream(p.getErrorStream());
|
// BufferedReader inBr = new BufferedReader(new InputStreamReader(in));
|
BufferedReader inBr = new BufferedReader(new InputStreamReader(p.getInputStream()));
|
|
String lineStr;
|
System.out.println("开始...");
|
while ((lineStr=inBr.readLine())!= null){
|
System.out.println(lineStr);
|
}
|
// System.out.println("flag"+flag);
|
// inBr.close();
|
// in.close();
|
// String s = executeCmd("taskkill /F /T /IM \"ffmpeg.exe\"");
|
// System.out.println(s);
|
|
p.waitFor();//等待子进程完成再往下执行。
|
}catch (Exception e){
|
System.out.println("异常:"+e.getMessage());
|
|
}
|
}
|
|
private static String executeCmd(String command) throws Exception{
|
Process process = Runtime.getRuntime().exec(command);
|
process.waitFor();//等待子进程完成再往下执行。
|
//创建bufferedReader
|
// BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
|
// String line = null;
|
// StringBuilder build = new StringBuilder();
|
// while ((line = bufferedReader.readLine()) != null) {
|
// line = new String(line.getBytes("UTF-8"));
|
// build.append(line);
|
// }
|
// bufferedReader.close();
|
int i = process.exitValue(); //接收执行完毕的返回值
|
if (i != 0) {
|
System.out.println("log info :cmd执行失败");
|
throw new RuntimeException("cmd执行失败");
|
}
|
process.destroy(); //销毁子进程
|
return "destroy ffmpeg success";
|
}
|
|
// public static void main(String[] args) throws Exception{
|
// System.out.println("-------开始推流--------");
|
// FFMpeg FFMpeg = new FFMpeg();
|
//// String ffmpegCmd = "D:\\Screen Capturer Recorder\\configuration_setup_utility\\vendor\\ffmpeg\\bin\\ffmpeg -re -i D:\\BaiduNetdiskDownload\\test.mp4 -c copy -f flv rtmp://127.0.0.1:1935/live/test";
|
// String ffmpegCmd = "D:\\Screen Capturer Recorder\\configuration_setup_utility\\vendor\\ffmpeg\\bin\\ffmpeg -f dshow -i video=\"screen-capture-recorder\" -f dshow -i audio=\"virtual-audio-capturer\" -ac 2 -b:a 128k -strict -2 -vcodec libx264 -preset:v ultrafast -pix_fmt yuv420p -acodec aac -f flv rtmp://127.0.0.1:1935/live/test";
|
//
|
//// ffmpeg -f gdigrab -t 30 -framerate 15 -i desktop -f dshow -i audio="virtual-audio-capturer" -f flv rtmp://127.0.0.1/live/tes
|
// FFMpeg.setFfmpegCmd(ffmpegCmd);
|
// FFMpeg.start();
|
//// FFMpeg.join();
|
// FFMpeg.flag = System.in.read();
|
// System.out.println("--------推流结束--------");
|
// }
|
|
public static void exec(String cmd){
|
System.out.println("-------start execute--------");
|
FFMpeg FFMpeg = new FFMpeg();
|
String ffmpegCmd = cmd;
|
FFMpeg.setFfmpegCmd(ffmpegCmd);
|
FFMpeg.start();
|
System.out.println("--------end execute--------");
|
}
|
}
|