获取rtsp流直播视频当前帧图片 FFmpegFrameGrabber

导入maven依赖

<dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.1</version>
            <type>pom</type>
        </dependency>

代码部分

import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import org.bytedeco.opencv.global.opencv_core;
import org.bytedeco.opencv.opencv_core.IplImage;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.Buffer;
import java.util.UUID;
 /**
     * 
     * @param videoFileName rtsp流地址 或本地video
     */
public static void grabberVideoFramer(String videoFileName) {
        //Frame对象
        Frame frame = null;
        //标识
        int flag = 0;
        /*
            获取视频文件
         */
        //FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath + "/" + videoFileName);
        FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoFileName);

        try {
            fFmpegFrameGrabber.start();
            /*
            .getFrameRate()方法:获取视频文件信息,总帧数
             */
            int ftp = fFmpegFrameGrabber.getLengthInFrames();
            System.out.println("=======》读取视频帧数:"+ftp);
            System.out.println("=======》读取视频帧率:"+fFmpegFrameGrabber.getFrameRate());
            
            System.out.println("时长 " + ftp / fFmpegFrameGrabber.getFrameRate() / 60);

            BufferedImage bImage = null;

/*
            while (flag <= ftp) {
            //每次取一帧
                frame = fFmpegFrameGrabber.grabFrame();
                //避免前5帧为黑
                if ((flag>5)&& frame.image!= null) {
                    break;
                }
                flag++;
            }*/

            //文件绝对路径+名字
            String fileName = 存储图片绝对路径
            //文件储存对象
            File outPut = new File(fileName);
            //获取帧
            frame = fFmpegFrameGrabber.grabImage();
            if (frame!=null){
                BufferedImage bufferedImage = FrameToBufferedImage(frame);
                int bufferedImageWidth = bufferedImage.getWidth();
                int bufferedImageHeight = bufferedImage.getHeight();
                //对截图进行等比例缩放
                int width=480;
                int height=(int) (((double)width/bufferedImageWidth)*bufferedImageHeight);
                BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
                image.getGraphics().drawImage(bufferedImage.getScaledInstance(width,height, Image.SCALE_SMOOTH),0,0,null);
                ImageIO.write(image, "png", outPut);
            }
            fFmpegFrameGrabber.stop();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
TODO 将frame转换为bufferedImage对象
 public static BufferedImage FrameToBufferedImage(Frame frame) {
        //创建BufferedImage对象
        Java2DFrameConverter converter = new Java2DFrameConverter();
        BufferedImage bufferedImage = converter.getBufferedImage(frame);
        return bufferedImage;
    }

将视频每帧转成图片

public static void grabberVideoFramer(String videoFileName) {
        //Frame对象
        Frame frame = null;
        //标识
        int flag = 0;
        *//*
            获取视频文件
         *//*
        FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoFileName);

        try {
            fFmpegFrameGrabber.start();
            /*
            .getFrameRate()方法:获取视频文件信息,总帧数
             */
            int ftp = fFmpegFrameGrabber.getLengthInFrames();

            System.out.println("时长 " + ftp / fFmpegFrameGrabber.getFrameRate() / 60);

            BufferedImage bImage = null;


            while (flag <= ftp) {
                //文件绝对路径+名字
                String fileName = videoFramesPath  + String.valueOf(flag) + ".jpg";
                //文件储存对象
                File outPut = new File(fileName);
                //获取帧
                frame = fFmpegFrameGrabber.grabImage();

                if (frame != null) {
                    ImageIO.write(FrameToBufferedImage(frame), "jpg", outPut);
                }
                flag++;
            }
            fFmpegFrameGrabber.stop();
        } catch (IOException E) {

        }
    }

参考:https://doc.xuehai.net/b9170c98c0b48bbaabe16154fed9dda2ddc25c0e8.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值