代码地址:https://gitee.com/panmingshuai/ffmpeg-demo.gitjava
代码荡下来后,resource目录下有一个ffmpeg.zip的压缩包,解压放到E:\ffmpeg下:git
而后咱们利用java调用ffmpeg的命令执行视频的相关操做:ui
将视频转为flv格式编码
public static void processFLV() throws IOException { List<String> commend = new ArrayList<String>(); commend.add("E:\\ffmpeg\\ffmpeg"); // ffmpeg文件的位置 commend.add("-i"); commend.add("E:\\qwe.mp4"); 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("E:\\qwenew.flv"); ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.start(); }
这里的-i表示须要操做的文件的路径,命令最后的路径表示处理好的文件存放的路径和文件名,记得写上.flv。code
指定格式的转换视频
// 指定格式转换 可是这里没有设置其余参数,因此生成的文件以ffmpeg内置的生成 // MP4转avi c:\ffmpeg\ffmpeg -i c:\ffmpeg\input\c.mp4 -f avi // c:\ffmpeg\output\a.avi public static void process() throws IOException { List<String> commend = new ArrayList<String>(); commend.add("E:\\ffmpeg\\ffmpeg"); // ffmpeg文件的位置 commend.add("-i"); // 指定要处理的文件 commend.add("E:\\qwe.mp4"); commend.add("-f"); // 指定转换格式 commend.add("avi"); commend.add("E:\\qwe2.avi"); // 最后指定文件输出的路径 ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.start(); }
这里的-f表示指定什么格式进行强制转换,这里选了人见人爱的avi格式。ip
视频截图:ci
// 截图 // ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg public static void cutScreen() throws IOException { List<String> commend = new ArrayList<String>(); commend.add("E:\\ffmpeg\\ffmpeg"); // ffmpeg文件的位置 commend.add("-i"); commend.add("E:\\qwe.mp4"); commend.add("-y");// 输出覆盖路径,即若是已存在下面指定路径的文件,则覆盖掉 commend.add("-f"); commend.add("image2"); commend.add("-ss"); // 指定在哪截图 commend.add("5"); commend.add("-t"); // 指定要记录的时间,由于是截图因此是0.001s commend.add("0.001"); commend.add("-s"); commend.add("1920x1080"); commend.add("E:\\qwe3.jpg"); ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.start(); }
这里的-ss表示在视频的哪里截图,他的单位是秒,即也能够用HH:mm:ss的形式。还有一种按多少帧截图的,可是感受不实用,通常人都是说在多少时间截图,没听过谁要求在多少帧截图的。-t表示视频截得时间持续多久,单位也是秒,由于是截图因此设定为0.001秒。-s表示截图的长宽多少。get
截取视频段:input
// 截取视频 public static void cutVedio() throws IOException { List<String> commend = new ArrayList<String>(); commend.add("E:\\ffmpeg\\ffmpeg"); // ffmpeg文件的位置 commend.add("-i"); commend.add("E:\\qwe.mp4"); commend.add("-vcodec");//视频使用原来同样的视频编解码器。 commend.add("copy"); commend.add("-acodec");//音频使用原来同样的音频编解码器。 commend.add("copy"); commend.add("-ss"); commend.add("00:00:25"); commend.add("-t"); commend.add("10"); commend.add("E:\\qwe563.mp4"); commend.add("-y"); ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.start(); }
这段出现的都是以前介绍过的,就很少说了
下面列出一些经常使用的ffmpeg的命令,能够像上面同样调用
-L license
-h 帮助
-fromats 显示可用的格式,编解码的,协议的。。。
-f fmt 强迫采用格式fmt
-I filename 输入文件
-y 覆盖输出文件
-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持
-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持
-title string 设置标题
-author string 设置做者
-copyright string 设置版权
-comment string 设置评论
-target type 设置目标文件类型(vcd,svcd,dvd)
视频选项:
-b bitrate 设置比特率,缺省200kb/s
-r fps 设置帧频 缺省25
-s size 设置帧大小 格式为WXH 缺省160X128.下面的简写也能够直接使用:
Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
-vn 不作视频记录
-bt tolerance 设置视频码率容忍度kbit/s
-vcodec codec 强制使用codec编解码方式。若是用copy表示原始编解码数据必须被拷贝。
-pass n 选择处理遍数(1或者2)。两遍编码很是有用。第一遍生成统计信息,第二遍生成精确的请求的码率
音频选项:
-ac channels 设置通道 缺省为1
-an 不使能音频纪录
-acodec codec 使用codec编解码