Java 实现视频转FLV,支持完成进度百分比
视频转换主要采用ffmpeg,下载去官网即可
转换主程序:
注:以下标粗的 ffmpeg 是 绝对路径如:D:/conver/ffmpeg-win.exe/** * * @Title: processFLV * @Description: 转FLV格式 * ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) * @param * @return boolean * @throws */ private static boolean coverToFLV(String srcVideoPath,String tarVideoPath) { if (!checkfile(srcVideoPath)) { logger.error("【" + srcVideoPath + "】 不存在 !"); return false; } List<String> commend = new java.util.ArrayList<String>(); commend.add(</span><strong><span style="font-size:18px;">ffmpegPath</span></strong><span style="font-size:14px;">); commend.add( "-y"); commend.add( "-i"); commend.add(srcVideoPath); commend.add("-ab"); commend.add("64"); //commend.add("-sameq"); commend.add("-acodec"); commend.add("mp3"); // commend.add("-vcodec"); // commend.add("xvid"); commend.add("-ac"); commend.add("2"); commend.add("-ar"); commend.add("22050"); commend.add("-qscale"); commend.add("6"); //压缩大小 // commend.add("-b"); // commend.add("1500"); commend.add("-r"); commend.add("24"); commend.add(tarVideoPath); try { ProcessBuilder builder = new ProcessBuilder(); //String cmd = commend.toString(); builder.command(commend); Process p = builder.start(); doWaitPro(p); //doWaitFor(p); p.destroy(); return true; } catch (Exception e) { e.printStackTrace(); return false; } }
等待线程完成: //等待线程处理完成 public static void doWaitPro(Process p){ try { String errorMsg = readInputStream(p.getErrorStream(), "error"); String outputMsg = readInputStream(p.getInputStream(), "out"); int c = p.waitFor(); if (c != 0) {// 如果处理进程在等待 System.out.println("处理失败:" + errorMsg); } else { System.out.println(COMPLETE + outputMsg); } } catch (IOException e) { // tanghui Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // tanghui Auto-generated catch block e.printStackTrace(); } }
完成进度百分比:
/** * * @Title: readInputStream * @Description: 完成进度百分比 * @param * @return String * @throws */ private static String readInputStream(InputStream is, String f) throws IOException { // 将进程的输出流封装成缓冲读者对象 BufferedReader br = new BufferedReader(new InputStreamReader(is)); StringBuffer lines = new StringBuffer();// 构造一个可变字符串 long totalTime = 0; // 对缓冲读者对象进行每行循环 for (String line = br.readLine(); line != null; line = br.readLine()) { lines.append(line);// 将每行信息字符串添加到可变字符串中 int positionDuration = line.indexOf("Duration:");// 在当前行中找到第一个"Duration:"的位置 int positionTime = line.indexOf("time="); if (positionDuration > 0) {// 如果当前行中有"Duration:" String dur = line.replace("Duration:", "");// 将当前行中"Duration:"替换为"" dur = dur.trim().substring(0, 8);// 将替换后的字符串去掉首尾空格后截取前8个字符 int h = Integer.parseInt(dur.substring(0, 2));// 封装成小时 int m = Integer.parseInt(dur.substring(3, 5));// 封装成分钟 int s = Integer.parseInt(dur.substring(6, 8));// 封装成秒 totalTime = h * 3600 + m * 60 + s;// 得到总共的时间秒数 } if (positionTime > 0) {// 如果所用时间字符串存在 // 截取包含time=的当前所用时间字符串 String time = line.substring(positionTime, line .indexOf("bitrate") - 1); time = time.substring(time.indexOf("=") + 1, time.indexOf("."));// 截取当前所用时间字符串 int h = Integer.parseInt(time.substring(0, 2));// 封装成小时 int m = Integer.parseInt(time.substring(3, 5));// 封装成分钟 int s = Integer.parseInt(time.substring(6, 8));// 封装成秒 long hasTime = h * 3600 + m * 60 + s;// 得到总共的时间秒数 float t = (float) hasTime / (float) totalTime;// 计算所用时间与总共需要时间的比例 COMPLETE = (int) Math.ceil(t * 100);// 计算完成进度百分比 } System.out.println("完成:" + COMPLETE + "%"); } br.close();// 关闭进程的输出流 return lines.toString(); }来自:http://blog.csdn.net/tanghui2qinghong/article/details/24304859