目录
下载安装
解压到指定文件夹
介绍与简单使用
FFmpeg是一个开源的跨平台视频和音频处理工具,可以处理各种格式的音视频文件。
FFmpeg的一些常用命令:
1. 查看文件信息 ffmpeg -i input_file
这个命令可以查看输入文件的详细信息,包括视频分辨率、帧率、码率、音频采样率、声道数等参数。
2. 视频转码 ffmpeg -i input_file -codec:v libx264 -codec:a libmp3lame output_file
这个命令将输入文件转换成H.264视频和MP3音频的输出文件。
-codec:v
表示视频编码器, -codec:a
表示音频编码器。
3. 裁剪视频 ffmpeg -i input_file -ss start_time -t duration output_file
这个命令可以在指定的时间点剪辑视频,并输出为新的文件。 -ss
表示开始时间, -t
表示裁剪的时长。
4. 视频剪切 ffmpeg -i input_file -ss start_time -to end_time output_file
这个命令也可以对视频进行剪辑,但是使用的是不同的参数。 -ss
表示开始时间, -to
表示结束时间。
5. 视频缩小 ffmpeg -i input_file -vf scale=320:240 output_file
这个命令可以将输入文件缩小到指定的分辨率。 -vf
表示视频滤镜。
6. 视频合并 ffmpeg -i "concat:input_file1|input_file2" -codec copy output_file
这个命令可以将多个视频文件合并成一个文件。
concat: 后面的部分表示要合并的文件列表,之间用|分隔。
在项目中的使用
配置文件
video-process:
ffmpeg-path: F:/AllSoft/ffmpeg-master-latest-win64-gpl/bin/ffmpeg.exe
工具类
可删除冗余代码
package com.scm.utils;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Mp4VideoUtil extends VideoUtil {
String ffmpeg_path = "D:\\Program Files\\ffmpeg-20180227-fa0c9d6-win64-static\\bin\\ffmpeg.exe";//ffmpeg的安装位置
String video_path = "D:\\BaiduNetdiskDownload\\test1.avi";
String mp4_name = "test1.mp4";
String mp4folder_path = "D:/BaiduNetdiskDownload/Movies/test1/";
public Mp4VideoUtil(String ffmpeg_path, String video_path, String mp4_name, String mp4folder_path){
super(ffmpeg_path);
this.ffmpeg_path = ffmpeg_path;
this.video_path = video_path;
this.mp4_name = mp4_name;
this.mp4folder_path = mp4folder_path;
}
//清除已生成的mp4
private void clear_mp4(String mp4_path){
//删除原来已经生成的m3u8及ts文件
File mp4File = new File(mp4_path);
if(mp4File.exists() && mp4File.isFile()){
mp4File.delete();
}
}
/**
* 视频编码,生成mp4文件
* @return 成功返回success,失败返回控制台日志
*/
public String generateMp4(){
//清除已生成的mp4
// clear_mp4(mp4folder_path+mp4_name);
clear_mp4(mp4folder_path);
/*
ffmpeg.exe -i lucene.avi -c:v libx264 -s 1280x720 -pix_fmt yuv420p -b:a 63k -b:v 753k -r 18 .\lucene.mp4
*/
List<String> commend = new ArrayList<String>();
//commend.add("D:\\Program Files\\ffmpeg-20180227-fa0c9d6-win64-static\\bin\\ffmpeg.exe");
commend.add(ffmpeg_path);
commend.add("-i");
// commend.add("D:\\BaiduNetdiskDownload\\test1.avi");
commend.add(video_path);
commend.add("-c:v");
commend.add("libx264");
commend.add("-y");//覆盖输出文件
commend.add("-s");
commend.add("1280x720");
commend.add("-pix_fmt");
commend.add("yuv420p");
commend.add("-b:a");
commend.add("63k");
commend.add("-b:v");
commend.add("753k");
commend.add("-r");
commend.add("18");
// commend.add(mp4folder_path + mp4_name );
commend.add(mp4folder_path );
String outstring = null;
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
//将标准输入流和错误输入流合并,通过标准输入流程读取信息
builder.redirectErrorStream(true);
Process p = builder.start();
outstring = waitFor(p);
} catch (Exception ex) {
ex.printStackTrace();
}
// Boolean check_video_time = this.check_video_time(video_path, mp4folder_path + mp4_name);
Boolean check_video_time = this.check_video_time(video_path, mp4folder_path);
if(!check_video_time){
return outstring;
}else{
return "success";
}
}
public static void main(String[] args) throws IOException {
// ProcessBuilder builder = new ProcessBuilder();
// builder.command("D:\\Program Files\\EditPlus\\EditPlus.exe");
// //将标准输入流和错误输入流合并,通过标准输入流程读取信息
// builder.redirectErrorStream(true);
// Process p = builder.start();
//ffmpeg的路径
String ffmpeg_path = "D:\\soft\\ffmpeg\\ffmpeg.exe";//ffmpeg的安装位置
//源avi视频的路径
String video_path = "D:\\develop\\upload\\02-概述-分库分表是什么.avi";
//转换后mp4文件的名称
String mp4_name = "02-概述-分库分表是什么.mp4";
//转换后mp4文件的路径
String mp4_path = "D:\\develop\\upload\\02-概述-分库分表是什么.mp4";
//创建工具类对象
Mp4VideoUtil videoUtil = new Mp4VideoUtil(ffmpeg_path,video_path,mp4_name,mp4_path);
//开始视频转换,成功将返回success
String s = videoUtil.generateMp4();
System.out.println(s);
}
}
使用
//ffmpeg的路径
@Value("${video-process.ffmpeg-path}")
private String ffmpegpath;
public void test(){
String video_path="xx";
String mp4_name="";
String mp4_path="";
//创建工具类对象
Mp4VideoUtil videoUtil = new Mp4VideoUtil(ffmpegpath, video_path, mp4_name, mp4_path);
//开始视频转换,成功将返回success,失败返回失败原因
String result = videoUtil.generateMp4();
if (!result.equals("success"))
{
log.debug("视频转码失败,原因:{}", result);
}
}