根据视屏地址截取第一帧图片

 <!--截取视屏图片-->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>ffmpeg-platform</artifactId>
            <version>3.2.1-1.3</version>
        </dependency>
	//个人命名
    private String bookImage = "assistantBook/bookImage/";
    
    //oss地址
    private String ossUrl = "http://www.baidu.com";
    
    /**
     * @param endPoint: 
     * @param accessKeyId: 
     * @param accessKeySecret: 
     * @param bucketName: 
     * @param videoFile: 需要截图的文件地址
     * @return: java.lang.String
     * @author: linyonghu
     * @date: 2021/12/7 10:24
     * @description:
     */
    public String fetchFrame(String endPoint, String accessKeyId, String accessKeySecret, String bucketName,String videoFile){
        String fileName = null;
        try{
            FFmpegFrameGrabber ff = new FFmpegFrameGrabber(ossUrl+videoFile);
            ff.start();
            int lenght = ff.getLengthInFrames();
            int i = 0;
            Frame f = null;
            while (i < lenght) {
                // 过滤前5帧,避免出现全黑的图片,依自己情况而定
                f = ff.grabFrame();
                if ((i > 48) && (f.image != null)) {
                    break;
                }
                i++;
            }
            int owidth = f.imageWidth;
            int oheight = f.imageHeight;
            // 对截取的帧进行等比例缩放
            int width = 400;
            int height = (int) (((double) width / owidth) * oheight);
            Java2DFrameConverter converter = new Java2DFrameConverter();
            BufferedImage fecthedImage = converter.getBufferedImage(f);
            BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
            bi.getGraphics().drawImage(fecthedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ImageIO.write(bi,"jpg",bos);
            byte[] byteArray = bos.toByteArray();
            ByteArrayInputStream bis = new ByteArrayInputStream(byteArray);
            fileName = bookImage + DateUtils.getDate("yyyyMMddHHmmss")+".jpg";
            upload(endPoint,accessKeyId,accessKeySecret,bucketName,bis,fileName);
            ff.flush();
            ff.stop();
            bos.flush();;
            bos.close();
            bis.close();
        }catch (Exception e){
            logger.info("生成图书图片异常{}",e.getMessage());
        }
        return fileName;
    }

    public void upload(String endPoint, String accessKeyId, String accessKeySecret, String bucketName, InputStream is, String path){
        OSSClient client = new OSSClient(endPoint,accessKeyId, accessKeySecret);
        try{
            if(path.startsWith("/")){
                path=path.substring(1);
            }
            client .putObject(bucketName, path, is);
        } catch(RuntimeException e){
            logger.error("oss上传文件流出错",e);
        } finally {
            client.shutdown();
        }
    }

转载:https://www.cnblogs.com/qinxiaofei/p/9766351.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用Python的OpenCV库来完成这个任务。下面是一个基本的代码示例: ``` python import cv2 # 打开视频 cap = cv2.VideoCapture('video.mp4') # 获取数和率 frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) fps = int(cap.get(cv2.CAP_PROP_FPS)) # 循环读取每一并保存为图片 for i in range(frame_count): ret, frame = cap.read() if not ret: break cv2.imwrite(f'frames/frame_{i}.jpg', frame) # 关闭视频 cap.release() # 将所有图片合成为视频 out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height)) for i in range(frame_count): frame = cv2.imread(f'frames/frame_{i}.jpg') out.write(frame) out.release() ``` 这个代码会将视频分成一图片,并保存在一个名为“frames”的文件夹中。然后,它会将所有图片合成为一个名为“output.mp4”的视频文件。你需要将 `video.mp4` 替换为你自己的视频文件,并根据需要修改输出视频的文件名和格式。 ### 回答2: Python可以通过使用OpenCV库来将视频分成一图片,并对每一进行处理。具体步骤如下: 1. 导入所需的库:首先需要导入OpenCV库和NumPy库。可以使用以下命令导入: ``` import cv2 import numpy as np ``` 2. 读取视频:使用`cv2.VideoCapture()`函数读取视频文件。例如,要读取名为“video.mp4”的视频文件,可以使用以下命令: ``` cap = cv2.VideoCapture("video.mp4") ``` 3. 分割视频:使用循环遍历每一,直到读取完整个视频。使用`cap.read()`函数读取每一,并将其保存为图像文件。下面是一个示例代码: ``` frame_count = 0 # 初始化计数器 while True: ret, frame = cap.read() # 读取视频的每一 if not ret: break # 如果视频结束,跳出循环 # 将每一保存为图像文件 cv2.imwrite("frame%d.jpg" % frame_count, frame) frame_count += 1 ``` 4. 处理每一的图像:根据需要,可以对每一的图像进行处理,例如修改颜色、裁剪、调整大小等等。使用OpenCV的图像处理函数来实现。 5. 将处理过的图像合成为视频:使用`cv2.VideoWriter()`函数创建一个新的视频文件,并将处理过的图像写入其中。下面是一个示例代码: ``` video_output = cv2.VideoWriter("output.mp4", cv2.VideoWriter_fourcc(*"mp4v"), 25, (width, height)) for i in range(frame_count): frame = cv2.imread("frame%d.jpg" % i) # 读取处理过的每一图像 # 将每一写入视频 video_output.write(frame) video_output.release() # 关闭视频文件 ``` 以上是将视频分成一图片、对每一进行处理并将处理过的图像合成为视频的基本步骤和示例代码。请根据实际需求进行适当的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值