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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM