使用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去掉,一切其它的比如畫質問題,暫時還沒有找到好的解決辦法,各位如果知道怎么解決,可以留言告訴我一下,不勝感激。