• 使用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去掉,一切其它的比如画质问题,暂时还没有找到好的解决办法,各位如果知道怎么解决,可以留言告诉我一下,不胜感激。

  • 相关阅读:
    java入门-使用idea创建web项目
    java入门-gitlab
    linux基础:source和sh的区别
    github基本使用
    docker-compose
    k8s学习笔记之六:flannel网络配置
    计算机网络
    python自学之路--python面试题
    ASP.NET前后端分离框架(转载)
    ASP.NET Core初步使用Quartz.NET(转载)
  • 原文地址:https://www.cnblogs.com/G1432291874/p/9346026.html
Copyright © 2020-2023  润新知