java调用ffmpeg实现视频转码和截屏功能（其实还有更多的功能就看你的需求进行改进了）参考文章地址https://www.cnblogs.com/tohxyblog/p/6640786.html
因为视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件，百度搜索了一下，大都使用的ffmpeg进行的视频转换，就去搜索了一下关于ffmpeg的简介，发现功能真的强大
ffmpeg视频采集功能非常强大，不仅可以采集视频采集卡或USB摄像头的图像，还可以进行屏幕录制，同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器，支持直播应用。
1.能支持的格式
ffmpeg能解析的格式：（asx，asf，mpg，wmv，3gp，mp4，mov，avi，flv等）
2.不能支持的格式
对ffmpeg无法解析的文件格式(wmv9，rm，rmvb等),可以先用别的工具（mencoder）转换为avi(ffmpeg能解析的)格式.
实例是将上传视频转码为flv格式,该格式ffmpeg支持,所以我们实例中需要ffmpeg视频处理工具
准备工作
windows下：
1.首先需要FFmpeg和mencoder的工具。一共五个文件，点此下载，将他解压放在你的D盘FFmpeg文件夹下。(需要注意的是）
温馨提示：ffmpeg.exe可以下载static版本里面的，要不有些应用命令可能不可以使用
具体原因参考：https://www.jianshu.com/p/ddafe46827b7
ffmpeg.exe下载地址：https://ffmpeg.zeranoe.com/builds/

2：linux下
依次执行下面的指令 1.下载yasm-1.3.0.tar.gz这个版本： ?1yasm是一个完全重写的NASM汇编。目前，它支持x86和AMD64指令集，接受NASM和气体汇编语法，产出二进制， ELF32 ， ELF64 ， COFF ， Mach - O的（ 32和64 ） ， RDOFF2 ，的Win32和Win64对象的格式，并生成STABS 调试信息的来源，DWARF 2 ，CodeView 8格式。之所以在FFmpeg中用这个，主要是支持编译ffmpeg-x264. wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz tar xzvf yasm-1.3.0.tar.gz cd yasm-1.3.0 ./configure make make install 2.下载3.1.3 release ffmpeg wget http://ffmpeg.org/releases/ffmpeg-3.1.3.tar.gz tar -zxvf ffmpeg-3.1.3.tar.gz cd ffmpeg-3.1.3 ./configure make make install 第二步的时间可能会有点长，耐心等待~！安装完成之后输入 ffmpeg -version 可以看到版本说明安装成功
java代码
package com.fallrain.controller; import java.io.File; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * 实现了视频的转换，和视频任意时间段的截取 * @Auther: LL * @Date: 2019/4/16 12:55 */ public class ConvertVideo { // 【需要转码的视频路径,最终转成flv格式】-----------2 ：首先获取视频的地址 private final static String PATH = "E:\\YoukuFiles\\download\\fff.mp4"; // 1：首先执行main函数 public static void main(String[] args) { if (!checkfile(PATH)) { //判断路径是不是一个文件 System.out.println(PATH + " is not file"); return; } if (process()) { //执行转码任务 System.out.println("ok"); } } private static boolean checkfile(String path) { File file = new File(path); if (!file.isFile()) { return false; } return true; } // 4：判断文件的类型进行转换 private static boolean process() { // 判断视频的类型 int type = checkContentType(); boolean status = false; //如果是ffmpeg可以转换的类型直接转码，否则先用mencoder转码成AVI if (type == 0) { System.out.println("直接将文件转为flv文件"); status = processFLV(PATH);// 直接将文件转为flv文件 } else if (type == 1) { String avifilepath = processAVI(type); if (avifilepath == null) { return false;// avi文件没有得到 } status = processFLV(avifilepath);// 将avi转为flv } return status; } // 3：得到文件的类型 private static int checkContentType() { String type = PATH.substring(PATH.lastIndexOf(".") + 1, PATH.length()) .toLowerCase(); // ffmpeg能解析的格式：（asx，asf，mpg，wmv，3gp，mp4，mov，avi，flv等） if (type.equals("avi")) { return 0; } else if (type.equals("mpg")) { return 0; } else if (type.equals("wmv")) { return 0; } else if (type.equals("3gp")) { return 0; } else if (type.equals("mov")) { return 0; } else if (type.equals("mp4")) { return 0; } else if (type.equals("asf")) { return 0; } else if (type.equals("asx")) { return 0; } else if (type.equals("flv")) { return 0; } // 对ffmpeg无法解析的文件格式(wmv9，rm，rmvb等), // 可以先用别的工具（mencoder）转换为avi(ffmpeg能解析的)格式. else if (type.equals("wmv9")) { return 1; } else if (type.equals("rm")) { return 1; } else if (type.equals("rmvb")) { return 1; } return 9; } // 5：在第四步中调取执行----主要作用就是如果ffmpeg无法进行转码了，调用另一个转码工具mencode把视频先转换为avi格式 // 对ffmpeg无法解析的文件格式(wmv9，rm，rmvb等), 可以先用别的工具（mencoder）转换为avi(ffmpeg能解析的)格式. private static String processAVI(int type) { List<String> commend = new ArrayList<String>(); commend.add("c:\\ffmpeg\\mencoder"); commend.add(PATH); commend.add("-oac"); commend.add("lavc"); commend.add("-lavcopts"); commend.add("acodec=mp3:abitrate=64"); commend.add("-ovc"); commend.add("xvid"); commend.add("-xvidencopts"); commend.add("bitrate=600"); commend.add("-of"); commend.add("avi"); commend.add("-o"); commend.add("D:\\FFmpeg\\shipin.avi");//存放转码后视频的路径，记住一定是.avi后缀的文件名】 try { //调用线程命令启动转码 ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.start(); return "D:\\FFmpeg\\shipin.avi";//【存放转码后视频的路径，记住一定是.avi后缀的文件名】 } catch (Exception e) { e.printStackTrace(); return null; } } // 最后一步 因为可以直接用ffmpeg转码，所以进行转码工作把视频转为flv格式，最后截取一帧页面图 // ffmpeg能解析的格式：（asx，asf，mpg，wmv，3gp，mp4，mov，avi，flv等） private static boolean processFLV(String oldfilepath) { if (!checkfile(PATH)) { System.out.println(oldfilepath + " is not file"); return false; } // 文件命名 Calendar c = Calendar.getInstance(); String savename = String.valueOf(c.getTimeInMillis())+ Math.round(Math.random() * 100000); List<String> commend = new ArrayList<String>(); commend.add("c:\\ffmpeg\\ffmpeg");//添加视频转码程序地址 commend.add("-i"); commend.add(oldfilepath); commend.add("-ab"); commend.add("56"); commend.add("-ar"); commend.add("22050"); commend.add("-qscale"); commend.add("8"); commend.add("-r"); commend.add("15"); commend.add("-s"); commend.add("600x500"); commend.add("D:\\ffmpeg\\shi.flv");//存放转码后视频的路径，记住一定是.flv后缀的文件名】 try { Runtime runtime = Runtime.getRuntime(); Process proce = null; //视频截图命令，封面图。 8是代表第8秒的时候截图 String cmd = ""; // 从5秒开始，截取10秒 每一秒截取一帧 -ss 表示开始时间 -t表示共要多少时间 -r 表示每一秒几帧 String cut = " c:\\ffmpeg\\ffmpeg.exe -i " + oldfilepath + " -ss 00:00:5 -t 10 -r 1 -q:v 2 -f image2 d:\\ffmpeg\\output\\"+"pic-%03d.jpeg" ; String cutCmd = cmd + cut; proce = runtime.exec(cutCmd); //调用线程命令进行转码 ProcessBuilder builder = new ProcessBuilder(commend); builder.command(commend); builder.start(); System.out.println("结束"); return true; } catch (Exception e) { e.printStackTrace(); return false; } } }
注：ffmpeg的功能十分强大，但是命令也非常多，转换每种格式的命令都不相同！需要转换其他格式的，请写对命令
命令格式：
普通转码：
ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]
比如：MP4转avi c:\ffmpeg\ffmpeg -i c:\ffmpeg\input\c.mp4 -f avi c:\ffmpeg\output\a.avi
参数：-an 去掉音频
-b 1000K 压缩码率为1000K
-s 800500 压缩尺寸为800500
-aspect 宽高比，格式 16:9 或 1.778
（当源尺寸是16:9，要压缩成非16:9的，一方面要设定 -s，另一方面要给出 -aspect）
-ss 开始时间
-t 持续时长