生活随笔
收集整理的这篇文章主要介绍了
windows下使用ffmpeg进行视频转换和截图。
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
author:fanfq(xiaoban)Email:fangqing.fan#gmail.com
link:http://fanfq.iteye.com/admin/blogs/655569
changelog:
有很多朋友发邮件问我关于ffmpeg视频转码的相关问题,我也尝试了帮助他们去解决这些问题,由于个人精力有限就blog上总结一下大家所遇到的一些问题。
以下代码只要是使用的我的包是肯定没有问题的,但是至限于*-》flv,因为不同格式的视频转码所对应的参数也是不一样的,想要达到效果教好的视频的话就得修改这些参数,但是我们有一个通用的方式,只要是ffmpeg支持的视频的话。使用 ffmpeg -i form.** to.** 就可以了,但是这只局限与测试。
windows环境测试
一.磨刀不误砍柴工
1.ffmpeg下载地址:https://ffmpeg.zeranoe.com/builds/,下载解压如下图所示:
在C:盘下创建一个文件夹C:\ffmpeg\,然后将上面截图的内容复制进去。
ffmpeg.exe能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
对ffmpeg.exe无法解析的文件格式(wmv9,rm,rmvb等),
可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式;
mencoder.exe;drv43260.dll;pncrt.dll这3个文件是为文件格式(wmv9,rm,rmvb等)
转换为avi(ffmpeg能解析的)格式准备的;再把转换好的avi文件再用ffmpeg.exe转换成flv格式的视频文件。。。
视频格式转换:
1 import java.io.File;
2 import java.util.ArrayList;
3 import java.util.Calendar;
4 import java.util.List;
5
6 public class Test {
7 private final static String PATH = "c:\\ffmpeg\\input\\c.mp4";
8
9 public static void main(String[] args) {
10 if (!checkfile(PATH)) {
11 System.out.println(PATH + " is not file");
12 return;
13 }
14 if (process()) {
15 System.out.println("ok");
16 }
17 }
18
19 private static boolean process() {
20 int type = checkContentType();
21 boolean status = false;
22 if (type == 0) {
23 System.out.println("直接将文件转为flv文件");
24 status = processFLV(PATH);// 直接将文件转为flv文件
25 } else if (type == 1) {
26 String avifilepath = processAVI(type);
27 if (avifilepath == null)
28 return false;// avi文件没有得到
29 status = processFLV(avifilepath);// 将avi转为flv
30 }
31 return status;
32 }
33
34 private static int checkContentType() {
35 String type = PATH.substring(PATH.lastIndexOf(".") + 1, PATH.length()).toLowerCase();
36 // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
37 if (type.equals("avi")) {
38 return 0;
39 } else if (type.equals("mpg")) {
40 return 0;
41 } else if (type.equals("wmv")) {
42 return 0;
43 } else if (type.equals("3gp")) {
44 return 0;
45 } else if (type.equals("mov")) {
46 return 0;
47 } else if (type.equals("mp4")) {
48 return 0;
49 } else if (type.equals("asf")) {
50 return 0;
51 } else if (type.equals("asx")) {
52 return 0;
53 } else if (type.equals("flv")) {
54 return 0;
55 }
56 // 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
57 // 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
58 else if (type.equals("wmv9")) {
59 return 1;
60 } else if (type.equals("rm")) {
61 return 1;
62 } else if (type.equals("rmvb")) {
63 return 1;
64 }
65 return 9;
66 }
67
68 private static boolean checkfile(String path) {
69 File file = new File(path);
70 if (!file.isFile()) {
71 return false;
72 }
73 return true;
74 }
75
76 // 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
77 private static String processAVI(int type) {
78 List<String> commend = new ArrayList<String>();
79 commend.add("c:\\ffmpeg\\mencoder");
80 commend.add(PATH);
81 commend.add("-oac");
82 commend.add("lavc");
83 commend.add("-lavcopts");
84 commend.add("acodec=mp3:abitrate=64");
85 commend.add("-ovc");
86 commend.add("xvid");
87 commend.add("-xvidencopts");
88 commend.add("bitrate=600");
89 commend.add("-of");
90 commend.add("avi");
91 commend.add("-o");
92 commend.add("c:\\ffmpeg\\output\\a.avi");
93 try {
94 ProcessBuilder builder = new ProcessBuilder();
95 builder.command(commend);
96 builder.start();
97 return "c:\\ffmpeg\\output\\a.avi";
98 } catch (Exception e) {
99 e.printStackTrace();
100 return null;
101 }
102 }
103
104 // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
105 private static boolean processFLV(String oldfilepath) {
106 if (!checkfile(PATH)) {
107 System.out.println(oldfilepath + " is not file");
108 return false;
109 }
110 // 文件命名
111 Calendar c = Calendar.getInstance();
112 String savename = String.valueOf(c.getTimeInMillis()) + Math.round(Math.random() * 100000);
113 List<String> commend = new ArrayList<String>();
114 commend.add("c:\\ffmpeg\\ffmpeg");
115 commend.add("-i");
116 commend.add(oldfilepath);
117 commend.add("-ab");
118 commend.add("56");
119 commend.add("-ar");
120 commend.add("22050");
121 commend.add("-qscale");
122 commend.add("8");
123 commend.add("-r");
124 commend.add("15");
125 commend.add("-s");
126 commend.add("600x500");
127 commend.add("c:\\ffmpeg\\output\\a.flv");
128 try {
129 Runtime runtime = Runtime.getRuntime();
130 Process proce = null;
131 String cmd = "";
132 String cut = " c:\\ffmpeg\\ffmpeg.exe -i " + oldfilepath
133 + " -y -f image2 -ss 8 -t 0.001 -s 600x500 c:\\ffmpeg\\output\\" + "a.jpg";
134 String cutCmd = cmd + cut;
135 proce = runtime.exec(cutCmd);
136 ProcessBuilder builder = new ProcessBuilder(commend);
137 builder.command(commend);
138 builder.start();
139 return true;
140 } catch (Exception e) {
141 e.printStackTrace();
142 return false;
143 }
144 }
145 }
视频截图:
import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class Ffmpeg {public static void main(String[] args) {// 视频文件String videoRealPath = "E:\\Eclipse2\\a.avi"
;// 截图的路径(输出路径)String imageRealPath = "E:\\Eclipse2\\atest.jpg"
;// 方法一:调用批处理程序,调用批处理文件ffmpeg.bat转换视频格式// try {// //调用批处理文件// Runtime.getRuntime().exec("cmd /c start// C:\\Users\\Administrator\\Desktop\\test\\ffmpeg.bat " + videoRealPath// + " " + imageRealPath);// } catch (IOException e) {// // TODO Auto-generated catch block// e.printStackTrace();// }// 方法二:通过命令提示符来调用需要添加系统路径(Path),调用menconder转换视频各种// commendF// .add("cmd.exe /c mencoder E:\\Eclipse2\\test.flv -o// e:\\Eclipse2\\test.avi// -oac mp3lame -lameopts cbr:br=32// -ovc x264 -x264encopts bitrate=440 -vf scale=448:-3");// 方法三:调用系统中的可执行程序调用ffmpeg 提取视屏缩略图List<String> commend =
new java.util.ArrayList<String>
();commend.add("E:\\Eclipse2\\Mplayer\\ffmpeg-git-4082198-win32-static\\bin\\ffmpeg.exe"
);commend.add("-i"
);commend.add(videoRealPath);commend.add("-y"
);commend.add("-f"
);commend.add("image2"
);commend.add("-ss"
);commend.add("8"
);commend.add("-t"
);commend.add("0.001"
);commend.add("-s"
);commend.add(imageRealPath);try {ProcessBuilder builder =
new ProcessBuilder();builder.command(commend);builder.redirectErrorStream(true);System.out.println("视频截图开始..."
);// builder.start();
Process process =
builder.start();InputStream in =
process.getInputStream();byte[] re =
new byte[1024
];System.out.print("正在进行截图,请稍候"
);while (in.read(re) != -1
) {System.out.print("."
);}System.out.println(""
);in.close();System.out.println("视频截图完成..."
);} catch (Exception e) {e.printStackTrace();System.out.println("视频截图失败!"
);}}
}
转载于:https://www.cnblogs.com/zhangqian1031/p/6114158.html
新人创作打卡挑战赛发博客就能抽奖!定制产品红包拿不停!
总结
以上是生活随笔为你收集整理的windows下使用ffmpeg进行视频转换和截图。的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。