- FFmpeg是一套对视频,音频进行格式化,转码,内容编辑,合并等操作的工具.
- ffmpeg官网
http://ffmpeg.org/
- ffmpeg对各大操作系统均有支持,github上中有其对应的源码,也可以直接下载编译后的工具使用
- 下载后将文件解压得到以下文件,其中bin目录下为所有ffmpeg可以行文件工具
-
示例:为视频添加背景音乐
-
命令格式,windows下需要加上.exe后缀
ffmpeg.exe -i 视频文件所在目录 -i 背景音乐所在目录 -t 输出视频时长 -y 输出文件路径
- 文件所在目录地址可以是相对路径,也可以是绝对路径
- 参数说明
参数 | 说明 |
---|---|
-i | 输入源 |
-t | 时长 |
-y | 是否覆盖同名文件 |
- 在bin目录下放一个测试视频文件
- 然后打开cmd命令行,输入以下命令,最后的输出文件名为 reset.mp4,视频时长为10秒
ffmpeg.exe -i test.mp4 -i E:\6.music\1.colud-music\花粥_在山河的角落里唱给你听.mp3 -t 10 reset.mp4
- 执行命令后命令行会出现以下内容
- 最后在bin目录下会得到rest.mp4文件,打开播放后会得到一个时长为10秒有背景音乐的视频
- 示例:截取视频中某一秒的图片
- 命令
ffmpeg.exe -ss 时间表达式 -y -i 目标视频路径 -vframes 1 视频输出地址
- 参数说明
参数 | 说明 |
---|---|
-ss | 时间段表达式,例如 00:00:01 表示为视频第一秒 |
-y | 是否覆盖同名文件 |
i | 输入源 |
vframes | 视频帧数 |
- 截取一个视频文件的第一秒图片
ffmpeg.exe -ss 00:00:01 -y -i test.mp4 -vframes 1 s.jpg
在Java中使用ffmpeg
- 在java程序中可以执行cmd命令行工具,需要使用到 ProcessBuilder 工具类
- 具体使用如下
// 可执行命令进程
ProcessBuilder processBuilder = new ProcessBuilder();
// 设置执行命令
List<String> command = new ArrayList<>();
command.add("ipconfig"); // 查看ip地址命令
processBuilder.command(command);
// 执行命令
Process start = processBuilder.start();
// 获取输入流
InputStream inputStream = start.getInputStream();
// 打印输入流信息
String string = StreamUtils.copyToString(inputStream, Charset.forName("GBK"));
System.out.println(string);
- 运行代码控制台打印以下内容
示例:使用java程序调用ffmpeg,合并视频与音频文件
// 可执行命令进程
ProcessBuilder processBuilder = new ProcessBuilder();
// 设置执行命令
List<String> command = new ArrayList<>();
// 可执行文件路径
String ffmpeg_exe = "D:\\1.dev-office\\19.ffmpeg\\ffmpeg\\bin\\ffmpeg.exe";
command.add(ffmpeg_exe);
// 命令参数
command.add("-i");
// 视频文件路径
String videoPath = "E:\\9.vedio\\test.mp4";
command.add(videoPath);
command.add("-i");
// 音频文件路径
String audioPath = "E:\\6.music\\1.colud-music\\花粥_在山河的角落里唱给你听.mp3";
command.add(audioPath);
// 格式化后视频输出路径
String outVideoPath = "E:\\9.vedio\\outVideoPath.mp4";
command.add(outVideoPath);
for (String str: command){
System.out.print(str + " ");
}
processBuilder.command(command);
// 执行命令
Process start = processBuilder.start();
// 得到输入流
InputStream inputStream = start.getInputStream();
// String string = StreamUtils.copyToString(inputStream, Charset.forName("GBK"));
OutputStream outputStream = start.getOutputStream();
InputStream errorStream = start.getErrorStream();
// 关闭流
if(inputStream != null){
inputStream.close();
}
if(outputStream != null){
outputStream.close();
}
if(errorStream != null){
errorStream.close();
}
// 打印执行命令后的内容
//System.out.println(string);
- 得到以下新文件