前言
最近在开发过程中,发现当我们上传除了mp4以外的其他少见的格式,如 .flv .rmvb 格式的视频时,在前端在线播放的时候会播放不出来画面,所以 接下来,将要进行一个非常完美的工程,将视频格式转为.mp4
1.安装 ffmpeg
ffmpeg有很多强大的功能,如进行视频切边 分隔 转码 等功能 。大家可以理解为是一个.exe文件 只要安装好 找到执行路径 就可以进行视频的操作。 话不多说 直接开始
2.下载ffmpeg包
OK 已经给大家准备好了 ffmpeg-5.1.1-amd64-static.tar.xz
链接: https://pan.baidu.com/s/1CmL0NNXtB2GQc8JwjE5IBg?pwd=1234 提取码: 1234
3.安装启动 ffmpeg
来 将下载好的放入 linux中 随便放到一个文件夹下 我一般喜欢放在 opt下
3.1 解压文件
# 解压.xz
xz -d ffmpeg-5.1.1-amd64-static.tar.xz
# 解压 tar
tar -xvf ffmpeg-5.1.1-amd64-static.tar.xz
3.2 启动 ffmpeg
进入 解压好的文件夹下
红框框 的 这两个 执行命令 很重要 使用java执行的时候 都是找到 ffmpeg 执行文件
# 进入解压好的文件夹
cd ffmpeg-5.1.1-amd64-static/
# 执行命令
./ffmpeg
出现以下执行成功
3.3 设置全局命令
# 进入 /usr/bin下
cd /usr/bin
# ln -s 自己的目录所在 别名
ln -s /opt/ffmpeg-5.1.1-amd64-static/ffmpeg ffmpeg
# ln -s 自己的目录所在 别名
ln -s /opt/ffmpeg-5.1.1-amd64-static/ffprobe ffprobe
4.测试
首先准备好一个随便格式的视频文件 我准备了一个 MP4的因为其他的也找不到 哈哈哈
执行命令
# ffmpeg -i 文件名 转好后的文件路径
ffmpeg -i input.mp4 -c:v libx264 -crf 19 -strict experimental /opt/out.mp4
ok 测试通过 就可以 使用java代码 进行 执行拉
5.java执行ffmpeg
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class FFmpegVideoConverter {
private final String ffmpegPath;
/**
* 构造函数,指定 FFmpeg 可执行文件路径
*/
public FFmpegVideoConverter(String ffmpegPath) {
this.ffmpegPath = ffmpegPath;
}
/**
* 将视频转换为 MP4 格式
* @param inputFilePath 输入视频文件路径
* @param outputFilePath 输出 MP4 文件路径
* @return 转换成功返回 true,失败返回 false
*/
public boolean convertToMP4(String inputFilePath, String outputFilePath) {
try {
// 构建 FFmpeg 命令
List<String> command = new ArrayList<>();
// ffmpegPath 为在linux安装好的执行命令 我所在的位置为 /opt/ffmpeg-5.1.1-amd64-static/ffmpeg
command.add(ffmpegPath);
command.add("-i");
// 源视频所在位置
command.add(inputFilePath);
command.add("-c:v");
command.add("libx264"); // 使用 H.264 视频编码
command.add("-preset");
command.add("medium"); // 编码速度与压缩比平衡
command.add("-crf");
command.add("23"); // 视频质量,数值越小质量越高 (0-51)
command.add("-c:a");
command.add("aac"); // 使用 AAC 音频编码
command.add("-strict");
command.add("experimental"); // 允许使用实验性编解码器
command.add("-b:a");
command.add("128k"); // 音频比特率
command.add("-movflags");
command.add("faststart"); // 优化 MP4 文件以便网络播放
command.add("-y"); // 覆盖已存在的文件
// 新文件所在位置
command.add(outputFilePath);
// 执行命令
ProcessBuilder processBuilder = new ProcessBuilder(command);
processBuilder.redirectErrorStream(true); // 合并标准输出和错误输出
Process process = processBuilder.start();
// 读取命令输出
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line); // 可替换为日志记录
}
// 等待命令执行完成
int exitCode = process.waitFor();
return exitCode == 0;
} catch (IOException | InterruptedException e) {
e.printStackTrace();
return false;
}
}
public static void main(String[] args) {
// 设置 FFmpeg 路径(根据实际情况修改)
String ffmpegPath = "/usr/bin/ffmpeg"; // Linux/Mac
// String ffmpegPath = "C:\\ffmpeg\\bin\\ffmpeg.exe"; // Windows
// 创建转换器实例
FFmpegVideoConverter converter = new FFmpegVideoConverter(ffmpegPath);
// 输入和输出文件路径
String inputFile = "input.avi"; // 替换为实际输入文件
String outputFile = "output.mp4"; // 替换为实际输出文件
// 执行转换
boolean success = converter.convertToMP4(inputFile, outputFile);
// 输出结果
if (success) {
System.out.println("视频转换成功!");
} else {
System.out.println("视频转换失败!");
}
}
}