bytedeco / javacv

Java interface to OpenCV, FFmpeg, and more
Other
7.45k stars 1.57k forks source link

pull rtsp stream ,grabber.grabFrame() is null wait a moment #2014

Closed hou718945431 closed 1 year ago

hou718945431 commented 1 year ago

我使用FFmpegFrameRecorder拉取rtsp流,然后逐帧解析过了一会获取到的都是null了,但rtsp流还是存在的,以下是我的代码

` FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("rtsp://10.40.152.162:8554/rtp/0BEBD622"); FFmpegFrameRecorder recorder = null; try { grabber.setOption("rtsp_transport", "tcp"); grabber.start(); //流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制) recorder = new FFmpegFrameRecorder("rtmp://10.40.152.162:1935/device/2",grabber.getImageWidth(),grabber.getImageHeight(), grabber.getAudioChannels() );

            recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);// 直播流格式
            recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
            //recorder.setFormat("rtp_mpegts");// 录制的视频格式
            recorder.setFormat("flv");
            recorder.setOption("rtsp_transport","tcp");
            recorder.setFrameRate(25);// 帧数
            recorder.setVideoBitrate(400000);
            recorder.start();

        avutil.av_log_set_level( avutil.AV_LOG_ERROR);

        while (true) {
            // 获取当前帧的图像数据
            Frame frame = grabber.grabFrame();
            if(frame==null){
               System.out.println("拉取流帧为空");
                grabber.start();
                continue;
            }
            recorder.record(frame);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (null != grabber) {
            try {
                grabber.stop();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (recorder != null) {
            try {
                recorder.stop();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }`