使用java执行ffmpeg命令进行推流操作

使用java执行ffmpeg命令进行推流操作

注:使用本方法可以实现rtsp流播放,但是存在一定问题,画质不清晰,播放画面不稳定,所以想要商用的小伙伴得自己想办法进行更改,要是想研究一下这个的话,可以自己试试, 如果能够找到解决办法,麻烦告诉一声,感激不尽。

      上一篇讲的是通过ffmpeg将rtsp转码为rtmp进行播放,但是操作过程是实现在cmd窗口中的,本篇将介绍如何在java中执行ffmpeg的命令。
      在开发工具中根据自己的需要新建项目,鉴于后面还要在页面播放,建议建立web项目。
      要在java中实现ffmpeg的命令行,首先要执行cmd命令,因此新建java类,然后将执行结果打印到控制台显示,详细代码如下:

String command = "ipconfig -all";
        String ip = "IPv4";
        String line = null;
        StringBuilder sb = new StringBuilder();
        Runtime run = Runtime.getRuntime();
        try {
            java.lang.Process process = run.exec("cmd.exe /k"+command);
            BufferedReader bufferReader=new BufferedReader(new InputStreamReader(process.getInputStream()));
            while((line = bufferReader.readLine()) != null){
                sb.append(line+"/n");
                if(line.contains(ip)){
                    System.out.println(line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

      好了,既然可以执行cmd命令,那个ffmpeg命令想必也是可以的吧,按照步骤我们应该先启动nginx服务器。当初博主在做的时候走了不少弯路,尤其是在写cmd命令的时候,需要拼接字符串,进入Nginx的根目录(cmd /c E: && cd nginx && start nginx),才可以正常启动,否则只执行命令不启动

注意:命令行中的start不能放错位置,也不可以将命令写在一行执行。

程序源码如下,里面附带如何关闭Nginx的方法:

    //启动nginx
        String cmd = "cmd /c E: && cd nginx && start nginx";
        //关闭nginx
        //String stop ="cmd /c E: && cd nginx && nginx.exe -s quit";
        Runtime run = Runtime.getRuntime();
        try {
            java.lang.Process process = run.exec(cmd);
            InputStream in = process.getInputStream();
            System.out.println(cmd);
            while (in.read()!=-1){
                System.out.println(in.read());
            }
            in.close();
            process.waitFor();
        } catch (IOException | InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

      到这里,已经完成一半了,下面的是重点部分,重新写一个java类,将rtsp推流的命令写到里面,注意的是也要加start才会执行,但是这一种方法,会在外部开启cmd窗口,如下所示:

    String all = "cmd /c start ffmpeg -i "rtsp://admin:123456@192.168.2.165:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif" "
                + "-f flv -r 25 -an -s 640*480 "rtmp://127.0.0.1:1935/hls/mystream"";
                + String line =null;
        StringBuilder sb = new StringBuilder();
        Runtime runtime = Runtime.getRuntime();
        try {
            System.out.println(all);
            java.lang.Process process = runtime.exec(all);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            while((line = bufferedReader.readLine())!= null){
                sb.append(line + "
");
                System.out.println(line);
                process.destroy();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

      还有一种方法,不需要在外部打开cmd窗口,只通过java就可以推流播放,可能你已经想到了,没错,那就是使用线程,将这段代码放到线程中即可,需要注意的是添加到县城中之后,命令行中的start需要删除掉(”cmd /k ffmpeg -i ”rtsp://admin:123456@192.168.2.165:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif” -f flv -r 25 -an -s 640*480 ”rtmp://127.0.0.1:1935/hls/mystream”“)


      然后自己在jsp页面,下好页面,将推送过来的rtmp地址放进去,即可在浏览器显示了,需要用的插件上一篇已经介绍过了,这里就不详细说了。
另外:如果有延迟的话,将推流命令行中的-an去掉,一切其它的比如画质问题,暂时还没有找到好的解决办法,各位如果知道怎么解决,可以留言告诉我一下,不胜感激。

原文地址:https://www.cnblogs.com/G1432291874/p/9346026.html