wangmengmeng
2024-12-24 24432a361d5c6bd6f3d8c008693e9f1155d62517
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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--------");
    }
}