IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> javacv视频获取第一帧作为缩略图 -> 正文阅读

[移动开发]javacv视频获取第一帧作为缩略图

POM 依赖
<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.4.2</version>
</dependency>

package xyz.vivo.video;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class VideoUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(VideoUtil.class);
    //参数:视频路径和缩略图保存路径
    public static Map<String, Object> getVideoInfo (InputStream videoInputSteam)
            throws Exception {
        long start = System.currentTimeMillis();
        Map<String, Object> result = new HashMap<String, Object>();
        FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videoInputSteam);
        ff.start();
        String rotate_old = ff.getVideoMetadata("rotate");
        int length = ff.getLengthInFrames();
        //设置视频截取帧(默认取第一帧)
        Frame frame = ff.grabImage();
        Java2DFrameConverter converter = new Java2DFrameConverter();
        //绘制图片
        BufferedImage bi = converter.getBufferedImage(frame);
        String rotate = ff.getVideoMetadata("rotate");
        result.put("videoWide", bi.getWidth());
        result.put("videoHigh", bi.getHeight());
        long duration = ff.getLengthInTime() / (1000 * 1000);
        result.put("rotate", StringUtils.isBlank(rotate) ? "0" : rotate);
        result.put("format", ff.getFormat());
        System.out.println(System.currentTimeMillis() - start);
    return  result;
    }
    //参数:视频路径和缩略图保存路径
    public static ByteArrayInputStream fetchFrame(InputStream videoInputSteam)
            throws Exception {
        long start = System.currentTimeMillis();
        FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videoInputSteam);
        ff.start();
        String rotate = ff.getVideoMetadata("rotate");
        int length = ff.getLengthInFrames();
        int i = 0;
        Frame f = null;
        while (i < length) {
            // 去掉前5帧,避免出现全黑的图片,依自己情况而定
            f = ff.grabImage();
            if ((i > 5) && (f.image != null)) {
                break;
            }
            i++;
        }
        int owidth = f.imageWidth;
        int oheight = f.imageHeight;
        // 对截取的帧进行等比例缩放
        int width = 800;//生成图片宽度为800px
        int height = (int) (((double) width / owidth) * oheight);
        Java2DFrameConverter converter = new Java2DFrameConverter();
        BufferedImage fecthedImage = converter.getBufferedImage(f);
        BufferedImage bi = new BufferedImage(owidth, oheight, BufferedImage.TYPE_3BYTE_BGR);
        bi.getGraphics().drawImage(fecthedImage.getScaledInstance(owidth, oheight, Image.SCALE_SMOOTH),
                0, 0, null);
        ImageIO.setUseCache(false);
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ImageIO.write(bi, "jpg", byteArrayOutputStream);
        ff.stop();
        if (rotate != null && !rotate.isEmpty()) {
            int rotateInt = Integer.parseInt(rotate);
            return  rotatePhonePhoto(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()), rotateInt);
        }
        long duration = ff.getLengthInTime() / (1000 * 1000);
        LOGGER.debug("视频的宽:" + bi.getWidth());
        LOGGER.debug("视频的高:" + bi.getHeight());
        LOGGER.debug("视频的旋转度:" + rotate);
        LOGGER.debug("视频的格式:" + ff.getFormat());
        LOGGER.debug("此视频时长(s/秒):" + duration);

        System.out.println(System.currentTimeMillis() - start);
        return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
    }

    /**
     * 旋转照片
     *
     * @param angel
     * @return
     */
    public static ByteArrayInputStream rotatePhonePhoto(InputStream inputStream, int angel) {
        BufferedImage src;
        try {
            src = ImageIO.read(inputStream);
            int src_width = src.getWidth(null);
            int src_height = src.getHeight(null);

            int swidth = src_width;
            int sheight = src_height;

            if (angel == 90 || angel == 270) {
                swidth = src_height;
                sheight = src_width;
            }
            Rectangle rect_des = new Rectangle(new Dimension(swidth, sheight));
            BufferedImage res = new BufferedImage(rect_des.width, rect_des.height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2 = res.createGraphics();
            g2.translate((rect_des.width - src_width) / 2, (rect_des.height - src_height) / 2);
            g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2);
            g2.drawImage(src, null, null);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            ImageIO.write(res, "jpg", byteArrayOutputStream);
            return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static BufferedImage FrameToBufferedImage(Frame frame) {
        //创建BufferedImage对象
        Java2DFrameConverter converter = new Java2DFrameConverter();
        BufferedImage bufferedImage = converter.getBufferedImage(frame);
        return bufferedImage;
    }

    public static void main(String[] args) throws Exception {
        ;
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\workspace\\flinkTutorial\\1234.jpg");
        IOUtils.copy(fetchFrame(new FileInputStream("E:\\workspace\\flinkTutorial\\1234.mp4")), fileOutputStream);
    }
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 12:00:36  更:2022-04-28 12:01:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 23:41:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码