bytedeco/javacv

FFmpegFrameGrabber grabImage() takes too long time.

Open

#1,902 opened on Oct 7, 2022

View on GitHub
 (0 comments) (1 reaction) (0 assignees)Java (1,583 forks)batch import
help wantedquestion

Repository metrics

Stars
 (6,985 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

Hi ! I meet a problem about this function , FFmpegFrameGrabber grabImage(),when I use sdp as grabber's source. If the sdp connection doesn't have any frame , the grabber.grabImage() will spend time about 10s then return null. Is there any solution to let this function return null immediately? I tried something methods like setOption("stime","1") , setTimeout(1),setOption(TimeoutOption.TIMEOUT.getKey(),String.valueOf(TIMEOUT * 50000))...These didn't work.Below is my code. Thanks for your reply!

FFmpegFrameGrabber grabber;	
FFmpegFrameRecorder recorder = null;

grabber = new FFmpegFrameGrabber("1111.sdp");
grabber.setVideoOption("vcodec", "copy");
grabber.setAudioChannels(0);
grabber.setOption("protocol_whitelist", "file,udp,rtp");
grabber.setTimeout(1);
grabber.setMaxDelay(1);
grabber.setOption("stime", "1");
grabber.delayedGrab(1);
grabber.setOption
(
        TimeoutOption.TIMEOUT.getKey(),
        String.valueOf(TIMEOUT * 50000)
);
grabber.start();


String fileName = "sample_rtp_out.h264";
recorder = new FFmpegFrameRecorder(fileName, 640, 480, 0);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); 
recorder.setFormat("h264");
recorder.setVideoOption("re", "");
recorder.setVideoOption("vcodec", "copy");
recorder.setAudioChannels(0);
recorder.start();

Frame frame;
while (true)
{
	
	frame=grabber.grabImage();
	
    if(frame!=null)
    {
        recorder.record(frame);
    }else
    {
    	    break;
    }
}

recorder.stop();
recorder.release();
grabber.stop();

Contributor guide