package com; import java.io.File; import java.util.List; /** * * @author 赵永恩 * 2011-03-18 */ public class Video { /** * @param args测试 */ public static void main(String[] args) { // TODO Auto-generated method stub String path = "D:\\test\\a.mp4"; String outFlvPath = "d:\\test\\2011.flv"; String outAviPath = "d:\\test\\20111.avi"; String outImgPath = "d:\\test\\20111.jpg"; boolean a = checkfile(path); System.out.println(a); boolean b = process(path, outFlvPath, outAviPath,outImgPath); System.out.println(b); System.out.println("ok"); } /** * 判断文件存在与否 * * @param path * @return */ private static boolean checkfile(String path) { File file = new File(path); if (!file.isFile()) { return false; } return true; } /** * 转换 * * @return */ private static boolean process(String path, String outflvPath, String outaviPath,String outImgPath) { int type = checkContentType(path); boolean status = false; if (type == 0) { status=ffmpegTransImage(path,outImgPath);//生成图片 processFLV(path, outflvPath);// 如果为零表示ffmpeg可以识别,直接将文件转为flv文件 } else if (type == 1) { String avifilepath = processAVI(type, path, outaviPath); if (avifilepath == null) return false;// avi文件没有得到 status = processFLV(avifilepath, outflvPath);// 将avi转为flv System.out.println("status====" + status); } return status; } /** * 判断文件格式 * * @return */ private static int checkContentType(String path) { 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; } else if (type.equals("vob")) { 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; } /** * 转换为flv * * ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) * * @param oldfilepath * @return */ private static boolean processFLV(String filepath, String outflvPath) { // 检查文件是否存在 if (!checkfile(filepath)) { System.out.println(filepath + " is not file"); return false; } Listcommend = new java.util.ArrayList (); commend.add("d:\\flv\\MediaCoder\\codecs\\ffmpeg.exe"); commend.add("-i"); commend.add(filepath); commend.add("-ab"); commend.add("64"); // commend.add(" -acodec "); // commend.add("codec"); commend.add("-ac"); commend.add("2"); commend.add("-ar"); commend.add("22050"); // 清晰度 -qscale 4 为最好可是文件大, -qscale 6就可以了 commend.add("-b"); commend.add("230"); // commend.add("-s"); // commend.add("350x240"); commend.add("-r"); commend.add("29.97"); commend.add("-y"); commend.add(outflvPath); System.out.println(commend); System.out.println("----"); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.start(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 无法解析的 先转换为avi * * 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式. * * @param type * @return */ private static String processAVI(int type, String path, String outaviPath) { List commend = new java.util.ArrayList (); commend.add("d:\\flv\\MediaCoder\\codecs\\mencoder.exe"); commend.add(path); // 音频采用mp3编码 commend.add("-oac"); commend.add("mp3lame"); // 采用高质DivX视频编码,视频码率为112kbps commend.add("-ovc"); commend.add("lavc"); commend.add("-lavcopts"); commend .add("vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=-1:cmp=3:vb_strategy=1"); commend.add("-lameopts"); commend.add("abr:br=56"); // 声音采样频率设置,现为22K commend.add("-srate"); commend.add("22050"); // -sws就是用来设置品质的,默认值为2 commend.add("-sws"); commend.add("3"); // 宽度为208,高度自动调整保持比例; // -vf scale=-3:176宽度自动调整保持比例,高度为176;如果想保持原来的大小可以不要这个参数 commend.add("-vf"); commend.add("scale=512:-3"); // 帧速率设置 commend.add("-ofps"); commend.add("18"); /* * mode=3:cbr:br=24单声道 音频码率为24kbps;-lameopts * mode=0:cbr:br=24立体声,音频码率为24kbps; 还可设置音量,-lameopts * mode=3:cbr:br=32:vol=1,设置范置为1~10,但不宜设得太高 */ commend.add("-lameopts"); commend.add("vbr=3:br=128"); commend.add("-o"); commend.add(outaviPath); // 控制台显示执行的命令 // System.out.println(commend); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.start(); return outaviPath; } catch (Exception e) { e.printStackTrace(); return null; } } /** * * 生成图片 参数String path(视频路径),String outImgPath(输出路径) * * public synchronized boolean ffmpegTransImage//这种写法不晓得为啥子不可以!貌似于线程有关 * */ public static boolean ffmpegTransImage(String path,String outImgPath) { List commend = new java.util.ArrayList (); commend.add("d:\\flv\\MediaCoder\\codecs\\ffmpeg.exe"); commend.add("-i"); commend.add(path); commend.add("-y"); commend.add("-f"); commend.add("image2"); commend.add("-ss"); commend.add("38");//截取图片针数 commend.add("-t"); commend.add("0.001"); commend.add("-s"); commend.add("320x240"); commend.add(outImgPath); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); builder.start(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } }
其实这是调用MediaCoder-0.7.5.4797.zip来转换的