一、Windows版本
1、下载
前往FFmpeg官网http://ffmpeg.org/download.html下载Windows版本FFmpeg(我下载ffmpeg-4.0-win64-shared)
2、解压
下载后解压到本地(我的解压目录D:\wedive_file\ffmpeg)
二、Linux版本
1、下载
前往FFmpeg官网http://ffmpeg.org/download.html下载Linux版本FFmpeg(我下载ffmpeg-snapshot.tar)前往http://yasm.tortall.net/Download.html 下载yasm(汇编器,有用)(我下载yasm-1.3.0.tar)
2、安装
(1)将Linux版本FFmpeg上传Linux解压(tar -xjvf ffmpeg-snapshot.tar.bz2);
(2)将汇编器yasm上传至Linux解压(tar -xvzf yasm-1.3.0.tar.gz);
(3)安装汇编器yasm
cd yasm-1.3.0;
./configure;
make install;
(4)yasm安装成功后,回到FFmpeg解压目录(此步骤编译过程有点长,请耐心等待,我也是这么等待过来的哦)
./configure --enable-shared --prefix=/monchickey/ffmpeg;(prefix后面是安装目录)
make install;
(5)安装成功后,前往安装目录cd /monchickey/ffmpeg/查看,发现有bin,include,lib,share这4个目录,其中bin是ffmpeg主程序二进制目录,include是C/C++头文件目录,lib是编译好的库文件目录,share是文档目录,然后进入bin目录,执行 ./ffmpeg -version 查看当前版本的详细信息,默认情况下一般会报libavdevice.so.57: cannot open shared object file: No such file or directory,原因是lib目录未加载到链接到系统库中,系统ld目录列表在/etc/ld.so.conf中,打开文件会发现,里面引用了/etc/ld.so.conf.d/下面所有的.conf文件,比如mariadb-x86_64.conf我们只需要创建一个文件并写入lib路径即可,执行命令: vim /etc/ld.so.conf.d/ffmpeg.conf 然后添加一行内容: /monchickey/ffmpeg/lib 之后保存并退出,然后执行 ldconfig 使配置生效,现在再次执行 ./ffmpeg -version 显示就正常了
三、Java代码
/**
* java调用FFmpeg截取视频做封面入口
* @param videoPath 视频路径
* @param ffmpegPath FFmpeg安装路径(Windows使用)
* @param coverPath 封面存储路径
*/
public static void processImgMain(String videoPath,String ffmpegPath,String coverPath){
if(ProjectConfig.
ENV.equals(ProjectConfig.
PROJECT_DEVLELOP)){//此处判断是否Windows,自己更改一下呗
processImg(videoPath,ffmpegPath,coverPath);
}
else {
String command =
"/monchickey/ffmpeg/bin/./ffmpeg -ss 00:00:00 -i " + videoPath
+
" -f image2 -y " + coverPath;
processImgCmd(command);
}
}
/**
* 截取视频封面 java Windows版本
* @param videoPath 视频路径
* @param ffmpegPath ffmpeg.exe存放路径 截取工具
* @param imgPath 封面存放路径
* @return
*/
public static boolean processImg(String videoPath,String ffmpegPath,String imgPath){
File file =
new File(videoPath);
if (!file.exists()) {
System.
err.println(
"路径[" + videoPath +
"]对应的视频文件不存在!");
return false;
}
List<String> commands =
new ArrayList<String>();
commands.add(ffmpegPath);
commands.add(
"-i");
commands.add(videoPath);
commands.add(
"-y");
commands.add(
"-f");
commands.add(
"image2");
commands.add(
"-ss");
commands.add(
"0");
//这个参数是设置截取视频多少秒时的画面
//commands.add("-t");
//commands.add("0.001");
commands.add(
"-s");
commands.add(
"700x525");
commands.add(imgPath);
try {
ProcessBuilder builder =
new ProcessBuilder();
builder.command(commands);
builder.start();
System.
out.println(
"截取成功");
return true;
}
catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* FFmpeg截取视频封面Linux版本
* @param command 执行cmd命令
*/
public static void processImgCmd(String command){
try {
Runtime rt = Runtime.
getRuntime();
Process proc = rt.exec(command);
InputStream stderr = proc.getErrorStream();
InputStreamReader isr =
new InputStreamReader(stderr);
BufferedReader br =
new BufferedReader(isr);
String line =
null;
System.
out.println(
"<ERROR>");
while ((line = br.readLine()) !=
null){
System.
out.println(line);
}
System.
out.println(
"</ERROR>");
int exitVal = proc.waitFor();
System.
out.println(
"Process exitValue: " + exitVal);
}
catch (Throwable t) {
System.
out.println(t);
t.printStackTrace();
}
}