使用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 + "\n");
                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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java使用FFmpeg进行推拉流涉及到音视频处理和流媒体操作。下面是一个简单的示例代码,展示了如何使用Java调用FFmpeg进行推拉流操作: 1. 首先,确保你已经安装了FFmpeg,并将其安装路径添加到系统的环境变量中。 2. 在Java项目中,你需要使用Java的ProcessBuilder类来执行FFmpeg命令。下面是一个简单的推流示例代码: ```java import java.io.IOException; public class FFmpegPushStreamExample { public static void main(String[] args) { String ffmpegPath = "ffmpeg的安装路径"; String inputUrl = "输入流URL"; String outputUrl = "输出流URL"; try { ProcessBuilder processBuilder = new ProcessBuilder( ffmpegPath, "-i", inputUrl, "-c:v", "copy", "-c:a", "copy", outputUrl ); processBuilder.inheritIO(); Process process = processBuilder.start(); process.waitFor(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在上述代码中,你需要将`ffmpegPath`替换为你的FFmpeg安装路径,将`inputUrl`替换为输入流URL,将`outputUrl`替换为输出流URL。这个示例使用了`copy`编解码器来快速拷贝输入流的音视频数据。 3. 如果你想要进行拉流操作,可以使用类似的方式执行FFmpeg命令。下面是一个简单的拉流示例代码: ```java import java.io.IOException; public class FFmpegPullStreamExample { public static void main(String[] args) { String ffmpegPath = "ffmpeg的安装路径"; String inputUrl = "输入流URL"; String outputFile = "输出文件路径"; try { ProcessBuilder processBuilder = new ProcessBuilder( ffmpegPath, "-i", inputUrl, "-c:v", "copy", "-c:a", "copy", outputFile ); processBuilder.inheritIO(); Process process = processBuilder.start(); process.waitFor(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在上述代码中,你需要将`ffmpegPath`替换为你的FFmpeg安装路径,将`inputUrl`替换为输入流URL,将`outputFile`替换为输出文件路径。这个示例同样使用了`copy`编解码器来快速拷贝输入流的音视频数据。 请注意,在实际项目中,你可能需要添加错误处理和日志记录等功能来增强代码的健壮性和可靠性。此外,还可以使用FFmpeg的其他参数和选项来满足具体的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值