南昌市物联网技防平台-后台
zengh
2021-05-26 d3b922f5bec465087f6586205ff70c2d2ac90260
视频录制问题修改
1 files modified
126 ■■■■ changed files
blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/rvideo/controller/RvideoController.java 126 ●●●● patch | view | raw | blame | history
blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/rvideo/controller/RvideoController.java
@@ -64,6 +64,15 @@
    private static  String UUIDs;
    private static  String uids;
    private static  int count=0;
    private static  String xcbj = "cs";
    //录制视频相关
    private static String streamURL;// 流地址(测试可以用obs推流)
    private static String filePath;// 文件路径
    private static Long timesSec = 100L;// 停止录制时长 0为不限制时长
    private static String fileFormat = "mp4";//录制的文件格式
    private static boolean isAudio = false;//是否录制声音
    private static boolean stop = false;
    /**
     * 详情
@@ -196,35 +205,126 @@
//    }
        /**
    /**
     * Javacv录制视频
     */
    @PostMapping("/rVoids")
    public void rVoids(String url,String uid) {
        String UUID = DateUtil.time();
    public void rVoids(String url,String uid,String jid) {
        /*String UUID = DateUtil.time();
        UUIDs=UUID;
        uids=uid;
        RecordVideoThread recordVideoThread = new RecordVideoThread();
        recordVideoThread.filePath = "D:\\software\\minio\\data\\jfpt\\void\\"+UUID + ".mp4";
        recordVideoThread.filePath = "D:\\video\\"+UUID + ".mp4";
        recordVideoThread.timesSec = 0L;
        String newJson = StringEscapeUtils.unescapeHtml4(url);
        recordVideoThread.streamURL =newJson;// 最好设置结束时长 如直接停止程序会造成输出文件的损坏无法正常播放
        recordVideoThread.isAudio = true;
        thread = new Thread(recordVideoThread);
        thread.start();
        thread.start();*/
        String UUID = DateUtil.time();
        UUIDs=UUID;
        uids=uid;
//        recordVideoThread.filePath = "D:\\software\\minio\\data\\jfpt\\void\\"+UUID + ".mp4";
        filePath = "D:\\video\\"+UUID + ".mp4";
        timesSec = 0L;
        String newJson = StringEscapeUtils.unescapeHtml4(url);
        streamURL =newJson;// 最好设置结束时长 如直接停止程序会造成输出文件的损坏无法正常播放
        isAudio = true;
        xcbj = "ce";
        Thread threads = new Thread(new Runnable() {
            @Override
            public void run() {
                //System.out.println("开始1111111");
                // 获取视频源
                FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(streamURL);
                FFmpegFrameRecorder recorder = null;
                try {
                    grabber.start();
                    Frame frame = grabber.grabFrame();
                    createFile();
                    //"rtmp://192.168.1.225:1935/live/home"
                    // 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
                    recorder = new FFmpegFrameRecorder(filePath, 1280, 720, isAudio ? 1 : 0);
                    recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);// 直播流格式
                    recorder.setFormat(fileFormat);// 录制的视频格式
                    recorder.setFrameRate(10);// 帧数
                    //百度翻译的比特率,默认400000,但是我400000贼模糊,调成800000比较合适
                    recorder.setVideoBitrate(800000);
                    recorder.start();
                    System.out.println("推流开始");
                    while (!jid.equals(xcbj)) {
                        if (frame != null){
                            System.out.println("开始");
                            recorder.record(frame);//录制
                            frame = grabber.grabFrame();//获取下一帧
                            System.out.println("结束");
                        }
                    }
                    if (jid.equals(xcbj)){
                        recorder.record(frame);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    //停止录制
                    if (null != grabber) {
                        try {
                            grabber.stop();
                        } catch (FrameGrabber.Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (recorder != null) {
                        try {
                            recorder.stop();
                        } catch (FrameRecorder.Exception e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("录制完成,录制时长:" + timesSec + "秒");
                }
            }
        });
        threads.start();
    }
    private void createFile() {
        File outFile = new File(filePath);
        if (filePath.isEmpty() || !outFile.exists() || outFile.isFile()) {
            try {
                outFile.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    @PostMapping("/stop")
    public String stop(String jid) throws FrameGrabber.Exception {
        //返回前端路径
        String vaddress = null;
        thread.stop();
        //返回路径
        vaddress = "https://web.byisf.com/" + PRF_MINIO_URL + UUIDs + ".mp4";
        //把路径通过警情id添加到警情信息
        alarmService.updateVaddress(vaddress,uids,jid);
        return vaddress;
//        String vaddress = null;
//        if (thread != null){
//            thread.stop();
//            //返回路径
//            vaddress = "https://web.byisf.com/" + PRF_MINIO_URL + UUIDs + ".mp4";
//            //把路径通过警情id添加到警情信息
//            alarmService.updateVaddress(vaddress,uids,jid);
//            return vaddress;
//        }
        xcbj = jid;
        return "";
    }