java ffmpeg(WindowsLinux)截取视频做封面

xiaoxiao2021-02-28  37

一、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(); } }
转载请注明原文地址: https://www.6miu.com/read-2624283.html

最新回复(0)