Java 跨平台多媒体处理样例

代码

java 复制代码
import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
import ws.schild.jave.Encoder;
import ws.schild.jave.MultimediaObject;
import ws.schild.jave.encode.AudioAttributes;
import ws.schild.jave.encode.EncodingAttributes;
import ws.schild.jave.process.ProcessWrapper;
import ws.schild.jave.process.ffmpeg.DefaultFFMPEGLocator;

import java.io.File;
import java.io.InputStream;

/**
 * 多媒体文件处理工具包
 */
@Slf4j
public class FfmpegUtil {

    /**
     * mp4转mp3
     *
     * @param src  源文件
     * @param dest 目标文件
     */
    public static void mp4ToMp3(String src, String dest) {
        FileUtil.writeUtf8String("", dest);
        File fileMp4 = new File(src);
        File fileMp3 = new File(dest);
        AudioAttributes audio = new AudioAttributes();
        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setOutputFormat("mp3");
        attrs.setAudioAttributes(audio);
        Encoder encoder = new Encoder();
        MultimediaObject mediaObject = new MultimediaObject(fileMp4);
        try {
            encoder.encode(mediaObject, fileMp3, attrs);
        } catch (Exception e) {
            log.error(ExceptionUtil.stacktraceToString(e));
        }
    }

    /**
     * 获取第一帧
     */
    public static void firstFrame(String src, String dest) {
        FileUtil.writeUtf8String("", dest);
        ProcessWrapper ffmpeg = new DefaultFFMPEGLocator().createExecutor();
        try {
            ffmpeg.addArgument("-i");
            ffmpeg.addArgument(src);
            ffmpeg.addArgument("-y");
            ffmpeg.addArgument("-ss");
            // 此处可自定义视频的秒数
            ffmpeg.addArgument("1");
            ffmpeg.addArgument("-vframes");
            ffmpeg.addArgument("1");
            ffmpeg.addArgument(dest);
            ffmpeg.execute();
            InputStream errorStream = ffmpeg.getErrorStream();
            String read = IoUtil.read(errorStream, CharsetUtil.UTF_8);
            System.out.println(read);
        } catch (Exception e) {
            log.error(ExceptionUtil.stacktraceToString(e));
        } finally {
            ffmpeg.close();
        }

    }
}

依赖

xml 复制代码
<!--hutool工具包-->
 <dependency>
     <groupId>cn.hutool</groupId>
     <artifactId>hutool-all</artifactId>
     <version>5.7.15</version>
 </dependency>

<!--java多媒体处理工具包-->
 <dependency>
     <groupId>ws.schild</groupId>
     <artifactId>jave-all-deps</artifactId>
     <version>3.2.0</version>
 </dependency>
相关推荐
维吉斯蔡3 小时前
【VS Code / Cursor】文件夹右键快捷打开与文件类型自动关联
开发语言·程序人生·学习方法
蓝斯4973 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加贝塞尔曲线,上、下、左、右连接点
java·c#·流程图
前端工作日常4 小时前
我学习到的Java 的 Service 分层:itf 和 impl 到底是什么?
java·后端
都叫我大帅哥4 小时前
Spring @Transactional 注解完全指南
java·spring
Java成神之路-4 小时前
G1 垃圾回收器 :SATB + TAMS核心机制深度解析
java·jvm
前端工作日常5 小时前
我学习到的JIT即时编译与机器码缓存失效
java·后端
带刺的坐椅5 小时前
Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎
java·solon·jetty·undertow·mcp-server·htttp
luj_17685 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
always_TT5 小时前
【Python 日志记录:logging 模块入门】
开发语言·python·php
xcLeigh6 小时前
Go入门:变量声明的五种方式详解
java·开发语言·golang