Spring 组件工具类-FFmpegUtils

java FFmpeg 多媒体处理工具类

FFmpeg 是一个强大的开源多媒体处理工具,支持视频、音频、字幕等多种格式的编解码、转码、剪辑、流处理等功能。基于 FFmpeg 命令行工具的多媒体处理工具类可以封装常用操作,简化开发流程,提高效率。

代码
java 复制代码
package com.easylive.common.utils;
import com.easylive.common.entity.config.AppConfig;
import com.easylive.common.entity.constants.Constants;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.File;
import java.math.BigDecimal;

@Component
public class FFmpegUtils {

    @Resource
    private AppConfig appConfig;


    /**
     * 生成图片缩略图
     *
     * @param filePath
     * @return
     */
    public void createImageThumbnail(String filePath) {
        final String CMD_CREATE_IMAGE_THUMBNAIL = "ffmpeg -i \"%s\" -vf scale=200:-1 \"%s\"";
        String cmd = String.format(CMD_CREATE_IMAGE_THUMBNAIL, filePath, filePath + Constants.IMAGE_THUMBNAIL_SUFFIX);
        ProcessUtils.executeCommand(cmd, appConfig.getShowFFmpegLog());
    }


    /**
     * 获取视频编码
     *
     * @param videoFilePath
     * @return
     */
    public String getVideoCodec(String videoFilePath) {
        final String CMD_GET_CODE = "ffprobe -v error -select_streams v:0 -show_entries stream=codec_name \"%s\"";
        String cmd = String.format(CMD_GET_CODE, videoFilePath);
        String result = ProcessUtils.executeCommand(cmd, appConfig.getShowFFmpegLog());
        result = result.replace("\n", "");
        result = result.substring(result.indexOf("=") + 1);
        String codec = result.substring(0, result.indexOf("["));
        return codec;
    }

    public void convertHevc2Mp4(String newFileName, String videoFilePath) {
        String CMD_HEVC_264 = "ffmpeg -i %s -c:v libx264 -crf 20 %s";
        String cmd = String.format(CMD_HEVC_264, newFileName, videoFilePath);
        ProcessUtils.executeCommand(cmd, appConfig.getShowFFmpegLog());
    }

    public void convertVideo2Ts(File tsFolder, String videoFilePath) {
        final String CMD_TRANSFER_2TS = "ffmpeg -y -i \"%s\"  -vcodec copy -acodec copy -bsf:v h264_mp4toannexb \"%s\"";
        final String CMD_CUT_TS = "ffmpeg -i \"%s\" -c copy -map 0 -f segment -segment_list \"%s\" -segment_time 10 %s/%%4d.ts";
        String tsPath = tsFolder + "/" + Constants.TS_NAME;
        //生成.ts
        String cmd = String.format(CMD_TRANSFER_2TS, videoFilePath, tsPath);
        ProcessUtils.executeCommand(cmd, appConfig.getShowFFmpegLog());
        //生成索引文件.m3u8 和切片.ts
        cmd = String.format(CMD_CUT_TS, tsPath, tsFolder.getPath() + "/" + Constants.M3U8_NAME, tsFolder.getPath());
        ProcessUtils.executeCommand(cmd, appConfig.getShowFFmpegLog());
        //删除index.ts
        new File(tsPath).delete();
    }


    public Integer getVideoInfoDuration(String completeVideo) {
        final String CMD_GET_CODE = "ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 \"%s\"";
        String cmd = String.format(CMD_GET_CODE, completeVideo);
        String result = ProcessUtils.executeCommand(cmd, appConfig.getShowFFmpegLog());
        if (StringTools.isEmpty(result)) {
            return 0;
        }
        result = result.replace("\n", "");
        return new BigDecimal(result).intValue();
    }
}
工具五大功能
方法 功能
createImageThumbnail 生成图片缩略图
getVideoCodec 获取视频编码
convertHevc2Mp4 H265转H264
convertVideo2Ts 视频切片生成 m3u8+ts
getVideoInfoDuration 获取视频时长
相关推荐
涡能增压发动积几秒前
日志里全是 $ref,但客户端居然没事?
后端
我叫黑大帅9 分钟前
受保护的海报图片读取方案 - 在不公开静态资源目录下如何获取静态资源
后端·python·面试
爱学习的小囧10 分钟前
ESXi性能历史怎么监控?2种方法,图形化+命令行全覆盖
java·linux·运维·服务器·网络·esxi·esxi8.0
我母鸡啊12 分钟前
软考架构师故事系列-嵌入式技术
后端
smileNicky13 分钟前
Spring AI系列之集成 Milvus 构建 RAG 智能问答系统
人工智能·spring·milvus
逻辑驱动的ken19 分钟前
Java高频面试考点场景题11
java·深度学习·面试·职场和发展·高效学习
MXN_小南学前端26 分钟前
Vue3 + Spring Boot 工单系统实战:用户反馈和客服处理的完整闭环(提供gitHub仓库地址)
前端·javascript·spring boot·后端·开源·github
JavaGuide33 分钟前
太魔幻了!SpaceX官宣600 亿美元收购Agent编程的鼻祖Cursor
人工智能·后端
学习3人组34 分钟前
面向对象编程:反射(Reflection)原理与应用详解
java
斯维赤37 分钟前
每天学习一个小算法:快速排序
java·python·学习·算法·排序算法