视频截屏(视频转图片)

复制代码
public class VideoToPicture {
    public static void main(String[] args) throws IOException {
        String filename = "D://tmp//4fbe1db0bd9e4a59ab380f262ea305c8.mp4";
        String id = UUID.randomUUID().toString().replace("-", "");
        String filename2 = "D://tmp//" + id + ".mp4";
        String outputFilename = "D://tmp//" + id + ".png";
        execute("视频地址", outputFilename, "mp4");
    }

    public static void base64ToVideo(String base64String, String outputFilename) {
        String prefix = "data:video/mp4;base64,";
        if (base64String.startsWith(prefix)) {
            base64String = base64String.replace(prefix, "");
        }
        byte[] decodedData = Base64.getDecoder().decode(base64String);
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(outputFilename);
            fos.write(decodedData);
            fos.flush();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 视频文件截图转图片存储
     *
     * @param inputFilename  视频文件
     * @param outputFilename 图片输出地址
     * @param format         音频格式
     */
    public static void execute(String inputFilename, String outputFilename, String format) {
        Assert.hasText(inputFilename, "音频文件不能为空");
        Assert.hasText(outputFilename, "图片地址不能为空");
        Assert.hasText(format, "音频格式不能为空");
        IContainer container = IContainer.make();
        IContainerFormat containerFormat = IContainerFormat.make();
        containerFormat.setInputFormat(format);
        boolean notOpen = false;
        try {
            notOpen = container.open(inputFilename, IContainer.Type.READ, containerFormat) < 0;
        } catch (Exception e) {
            e.printStackTrace();
            throw new IllegalArgumentException("Could not open file: " + inputFilename);
        }
        if (notOpen) {
            throw new IllegalArgumentException("Could not open file: " + inputFilename);
        }
        int numStreams = container.getNumStreams();
        int videoStreamId = -1;
        IStreamCoder videoCoder = null;
        for (int i = 0; i < numStreams; i++) {
            IStream stream = container.getStream(i);
            IStreamCoder coder = stream.getStreamCoder();
            if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO) {
                videoStreamId = i;
                videoCoder = coder;
                break;
            }
        }
        if (videoStreamId == -1) {
            throw new RuntimeException("No video stream in container: " + inputFilename);
        }
        if (videoCoder.open() < 0) {
            throw new RuntimeException("Could not open video coder for container: " + inputFilename);
        }
        IVideoPicture picture = IVideoPicture.make(videoCoder.getPixelType(), videoCoder.getWidth(), videoCoder.getHeight());
        IPacket packet = IPacket.make();
        boolean isStop = false;
        while (!isStop && container.readNextPacket(packet) >= 0) {
            if (packet.getStreamIndex() == videoStreamId) {
                int offset = 0;
                while (offset < packet.getSize()) {
                    int bytesDecoded = videoCoder.decodeVideo(picture, packet, offset);
                    if (bytesDecoded < 0) {
                        throw new RuntimeException("Error decoding video");
                    }
                    offset += bytesDecoded;
                    if (picture.isComplete()) {
                        if (picture.getTimeStamp() > 1000) {
                            IConverter converter = ConverterFactory.createConverter("XUGGLER-BGR-24", picture);
                            BufferedImage javaImage = converter.toImage(picture);
                            try {
                                ImageIO.write(javaImage, "PNG", new File(outputFilename));
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            isStop = true;
                            break;
                        }
                    }
                }
            }
        }
        videoCoder.close();
        container.close();
    }
}
相关推荐
一只爱打拳的程序猿2 分钟前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring
杨荧3 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
minDuck5 分钟前
ruoyi-vue集成tianai-captcha验证码
java·前端·vue.js
为将者,自当识天晓地。24 分钟前
c++多线程
java·开发语言
daqinzl32 分钟前
java获取机器ip、mac
java·mac·ip
激流丶1 小时前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
Themberfue1 小时前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
让学习成为一种生活方式1 小时前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画1 小时前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
南宫生2 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法