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 | 获取视频时长 |