首页 > 代码库 > windows下使用ffmpeg进行视频转换和截图。
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("视频截图失败!"); } } }
windows下使用ffmpeg进行视频转换和截图。