前言
最近在开发过程中,发现当我们上传除了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/ffmpegcommand.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("视频转换失败!");}}
}