基于 Java 和 FFmpeg 的视频压缩与剪辑功能实现
在视频处理开发中,压缩和剪辑是常见的需求。本文将介绍如何使用 Java 结合 FFmpeg 实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理。
1. 环境准备
1.1 项目依赖
确保在 pom.xml
文件中添加以下依赖:
<dependencies>
<!-- 处理 JSON 的依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<!-- 文件处理工具 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>
1.2 安装 FFmpeg
确保本地已安装并配置好 FFmpeg,可以通过命令检查:
ffmpeg -version
如果未安装,可以参考 FFmpeg 官方下载链接 进行安装。
2. 视频压缩功能实现
2.1 主要功能
-
读取视频文件
-
获取视频的码率(bitrate)
-
压缩视频至指定码率
2.2 代码实现
import com.alibaba.fastjson.JSONObject;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
public class VideoService {
@Transactional
public void compress(JSONObject param) {
String title = param.getString("title");
String inputPath = param.getString("inputPath");
String outputPath = param.getString("outputPath");
try {
File inputFile = new File(inputPath);
if (!inputFile.exists() || !inputFile.isFile()) {
throw new RuntimeException("文件不存在");
}
// 假设压缩到 1M 码率(1000k)
int targetBitrate = 1000;
List<String> cmdList = Arrays.asList(
"ffmpeg", "-i", inputPath,
"-c:v", "libx264", "-b:v", targetBitrate + "k",
"-movflags", "+faststart", outputPath
);
System.out.println("执行命令: " + String.join(" ", cmdList));
Process process = new ProcessBuilder(cmdList).inheritIO().start();
process.waitFor();
} catch (Exception e) {
throw new RuntimeException("压缩失败: " + e.getMessage());
}
}
}
3. 视频剪辑功能实现
3.1 主要功能
-
读取视频文件
-
按照指定的开始和结束时间进行剪辑
-
保留原始视频流,确保兼容性
3.2 代码实现
import java.util.ArrayList;
import java.util.List;
public class VideoService {
@Transactional
public void videoClip(JSONObject param) {
String inputPath = param.getString("inputPath");
String outputPath = param.getString("outputPath");
String startTime = param.getString("startTime");
String endTime = param.getString("endTime");
try {
List<String> cmdList = new ArrayList<>();
cmdList.add("ffmpeg");
cmdList.add("-i");
cmdList.add(inputPath);
cmdList.add("-ss");
cmdList.add(startTime);
cmdList.add("-to");
cmdList.add(endTime);
cmdList.add("-c:v");
cmdList.add("copy"); // 保持视频流不变
cmdList.add("-c:a");
cmdList.add("aac"); // 音频使用 AAC 编码
cmdList.add("-movflags");
cmdList.add("+faststart"); // 优化播放体验
cmdList.add(outputPath);
System.out.println("执行命令: " + String.join(" ", cmdList));
Process process = new ProcessBuilder(cmdList).inheritIO().start();
process.waitFor();
} catch (Exception e) {
throw new RuntimeException("剪辑失败: " + e.getMessage());
}
}
}
4. 注意事项
-
FFmpeg 命令 的路径需要配置在环境变量中,确保在命令行可以直接使用。
-
输入和输出路径建议使用绝对路径,避免路径解析出错。
-
对于大视频文件,压缩和剪辑过程可能较长,建议在生产环境中使用异步处理。
5. 结语
通过以上步骤,我们实现了基于 Java 和 FFmpeg 的视频压缩和剪辑功能。实际使用中,可以根据需求调整码率、视频格式等参数,灵活应用于各种视频处理场景。如果对本文内容有疑问,欢迎在评论区留言交流。