javaCV開發詳解之3:收流器實現,錄制流媒體服務器的rtsp/rtmp視頻文件(基於javaCV-FFMPEG)


前言:
本章基於javaCV實現收流器功能和錄制功能
補充:基於本功能可以實現遠程流媒體服務器實時視頻錄制到本地
一、開發所依賴的包(與上一章相同,具體依賴包請查看上一章)
本章使用windows環境開發,基於javaCV的基礎支撐包以及ffmpeg-3.1.2-1.2.jar、ffmpeg-3.1.2-1.2-windows-x86.jar、ffmpeg-3.1.2-1.2-windows-x86_64.jar;

二、代碼實現
 

本功能采用按幀實現收流器錄制功能



    /**
         * 按幀錄制視頻
         *
         * @param inputFile-該地址可以是網絡直播/錄播地址,也可以是遠程/本地文件路徑
         * @param outputFile
         *            -該地址只能是文件地址,如果使用該方法推送流媒體服務器會報錯,原因是沒有設置編碼格式
         * @throws FrameGrabber.Exception
         * @throws FrameRecorder.Exception
         * @throws org.bytedeco.javacv.FrameRecorder.Exception
         */
        public static void frameRecord(String inputFile, String outputFile, int audioChannel)
                throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
            
                boolean isStart=true;//該變量建議設置為全局控制變量,用於控制錄制結束
            // 獲取視頻源
            FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
            // 流媒體輸出地址,分辨率(長,高),是否錄制音頻(0:不錄制/1:錄制)
            FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 1280, 720, audioChannel);
            // 開始取視頻源
            recordByFrame(grabber, recorder, isStart);
        }

    private static void recordByFrame(FFmpegFrameGrabber grabber, FFmpegFrameRecorder recorder, Boolean status)
                throws Exception, org.bytedeco.javacv.FrameRecorder.Exception {
            try {//建議在線程中使用該方法
                grabber.start();
                recorder.start();
                Frame frame = null;
                while (status&& (frame = grabber.grabFrame()) != null) {
                    recorder.record(frame);
                }
                recorder.stop();
                grabber.stop();
            } finally {
                if (grabber != null) {
                    grabber.stop();
                }
            }
        }

 

 
3、測試收流器錄制功能

inputFile設置為服務器播放地址,outputFile設置為本地地址,這里演示.mp4,也可以是flv等其他后綴名

    public static void main(String[] args)
                throws FrameRecorder.Exception, FrameGrabber.Exception, InterruptedException {
     
             String inputFile = "rtsp://admin:admin@192.168.2.236:37779/cam/realmonitor?channel=1&subtype=0";
             // Decodes-encodes
             String outputFile = "recorde.mp4";
             frameRecord(inputFile, outputFile,1);
    }

到這里我們已經實現了直播功能的全部基本操作:推流,錄制,簡單的直播系統和多人視頻等已經可以實現了;

突然發現,額。。。我們的直播系統貌似沒有聲音!!!好吧,確實是這樣,直播聽不到聲音確實有點low

那么聲音要怎么獲取呢?看這里實現:http://blog.csdn.net/eguid_1/article/details/52702385

聲音會獲取了,那么接下來讓我們實現一下本地音視頻混合推流到服務器吧:

javaCV開發詳解之6:本地音頻(話筒設備)和視頻(攝像頭)抓取、混合並推送(錄制)到服務器(本地)

但是我們的系統遠不止那么簡單,比如監控和專業的攝像頭,需要通過rtsp或者碼流的形式才能獲取視頻流,這時我們需要一個轉流器,幫助我們把他們轉發到流媒體服務器,實現實時監控/視頻查看


免責聲明!

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



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