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