视频截屏(视频转图片)

复制代码
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();
    }
}
相关推荐
坐吃山猪10 小时前
SpringBoot01-配置文件
java·开发语言
我叫汪枫10 小时前
《Java餐厅的待客之道:BIO, NIO, AIO三种服务模式的进化》
java·开发语言·nio
yaoxtao10 小时前
java.nio.file.InvalidPathException异常
java·linux·ubuntu
Swift社区12 小时前
从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
java·开发语言
DKPT13 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring
phltxy13 小时前
JVM——Java虚拟机学习
java·jvm·学习
seabirdssss14 小时前
使用Spring Boot DevTools快速重启功能
java·spring boot·后端
喂完待续14 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升
benben04414 小时前
ReAct模式解读
java·ai