package com.loach; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @Author : GaoMing * @Create_Date : 2019/09/21/09:56 * @Pack_name : com.loach : videoUnit * ***************************************************** * 注释: */ public class videoUnit { //定义一个输入流 private static String inputPath = ""; //定义一个输出流 private static String outputPath = ""; //FFmpeg 文件位置 private static String ffmpegPath = ""; public static void main(String args[]) throws IOException { getPath(); if (!checkfile(inputPath)) { System.out.println(inputPath + "is not file"); return; } if (process()) { System.out.println("转换成功。请移步" + outputPath + "查看"); } } /** * 获取Path 路径 */ public static void getPath() { // 先获取当前项目路径,在获得源文件、目标文件、转换器的路径 File diretory = new File(""); try { String currPath = diretory.getAbsolutePath(); inputPath = "H:\\yan\\a.flv"; outputPath = "H:\\video\\"; ffmpegPath = "H:\\ffmpeg\\bin\\"; System.out.println(currPath); } catch (Exception e) { System.out.println("获取文件路径出错 "); } } public static boolean process() { //0:FFmpeg 1:mencoder 9:无对应类型 int type = checkContentType(); System.out.println(type); boolean status = false; //FFmpeg能解析格式 直接转MP4 if (type == 0) { System.out.println("直接转成mp4格式"); //记录开始时间 long startTime = System.currentTimeMillis(); status = processMp4(inputPath); //记录结束时间 long endTime = System.currentTimeMillis(); //执行时长 float excTime = (float) (endTime - startTime) / 1000; System.out.println("执行时长" + excTime + "s"); return status; } // FFmpeg无法解析格式,使用mencoder转换AVI后再FFmpeg转MP4 if (type == 1) { System.out.println("mencoder转换AVI"); //记录开始时间 long startTime = System.currentTimeMillis(); String avifilepath = processAVI(type); if (avifilepath == null) { System.out.println("avi文件没有得到"); return false; } else { status = processMp4(inputPath); } //记录结束时间 long endTime = System.currentTimeMillis(); //执行时长 float excTime = (float) (endTime - startTime) / 1000; System.out.println("执行时长" + excTime + "s"); return status; } if (type == 9) { System.out.println("格式非法!"); return false; } return status; } /** * 判断FFmpeg能否转换 0:FFmpeg 1:mencoder 9:无法转换 * * @return */ private static int checkContentType() { String type = inputPath.substring(inputPath.lastIndexOf(".") + 1, inputPath.length()).toLowerCase(); // ffmpeg能解析的格式:(avi mpg wmv 3gp mov mp4 asf asx flv wmv9 rm rmvb ) 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; } /** * 对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; } private static boolean checkfile(String path) { File file = new File(path); if (!file.isFile()) { return false; } return true; } /** * 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式 * * @param type * @return */ private static String processAVI(int type) { List<String> commend = new ArrayList<String>(); commend.add(ffmpegPath + "mencoder"); commend.add(inputPath); commend.add("-oac"); commend.add("lavc"); commend.add("-lavcopts"); commend.add("acodec=mp3:abitrate=64"); commend.add("-ovc"); commend.add("xvid"); commend.add("-xvidencopts"); commend.add("bitrate=600"); commend.add("-of"); commend.add("mp4"); commend.add("-o"); commend.add(outputPath + "a.AVI"); try { ProcessBuilder builder = new ProcessBuilder(); Process process = builder.command(commend).redirectErrorStream(true).start(); new PrintStream(process.getInputStream()); new PrintStream(process.getErrorStream()); process.waitFor(); return outputPath + "a.AVI"; } catch (Exception e) { e.printStackTrace(); return null; } } /** * ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) * * @param oldfilepath * @return */ private static boolean processFlv(String oldfilepath) { if (!checkfile(inputPath)) { System.out.println(oldfilepath + " is not file"); return false; } List<String> command = new ArrayList<String>(); command.add(ffmpegPath + "ffmpeg"); command.add("-i"); command.add(oldfilepath); command.add("-ab"); command.add("56"); command.add("-ar"); command.add("22050"); command.add("-qscale"); command.add("8"); command.add("-r"); command.add("15"); command.add("-s"); command.add("600x500"); command.add(outputPath + "a.flv"); try { Process videoProcess = new ProcessBuilder(command).redirectErrorStream(true).start(); new PrintStream(videoProcess.getErrorStream()).start(); new PrintStream(videoProcess.getInputStream()).start(); videoProcess.waitFor(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * ffmpeg能解析的格式 直接转换MP4 * * @param oldfilepath * @return */ private static boolean processMp4(String oldfilepath) { if (!checkfile(inputPath)) { System.out.println(oldfilepath + " is not file"); return false; } List<String> command = new ArrayList<String>(); command.add(ffmpegPath + "ffmpeg"); command.add("-i"); command.add(oldfilepath); command.add("-c:v"); command.add("libx264"); command.add("-mbd"); command.add("0"); command.add("-c:a"); command.add("aac"); command.add("-strict"); command.add("-2"); command.add("-pix_fmt"); command.add("yuv420p"); command.add("-movflags"); command.add("faststart"); command.add(outputPath + "a.mp4"); try { Process videoProcess = new ProcessBuilder(command).redirectErrorStream(true).start(); new PrintStream(videoProcess.getErrorStream()).start(); new PrintStream(videoProcess.getInputStream()).start(); videoProcess.waitFor(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } static class PrintStream extends Thread { java.io.InputStream __is = null; public PrintStream(java.io.InputStream is) { __is = is; } @Override public void run() { try { while (this != null) { int _ch = __is.read(); if (_ch != -1) { System.out.print((char) _ch); } else { break; } } } catch (Exception e) { e.printStackTrace(); } } } }
最近下载更多
wanglinddad LV55
5月8日
sky丶小十 LV7
2023年12月18日
云破月 LV8
2022年4月19日
lz88888 LV12
2021年12月28日
sunlei56841 LV10
2021年12月9日
liyuehong LV1
2021年5月8日
chuangyou LV8
2021年1月19日
清风徐来defeng LV1
2021年1月13日
zhaowibing LV1
2020年6月12日
xiaobingb LV4
2020年6月6日
最近浏览更多
weimeidanzise
7月1日
暂无贡献等级
唯美淡紫色 LV1
7月1日
wanglinddad LV55
5月8日
sky丶小十 LV7
2023年12月18日
xiaochoushishei
2023年8月22日
暂无贡献等级
zzhua195 LV6
2023年5月12日
微信网友_5992582549164032 LV6
2023年2月21日
xingbing LV9
2023年2月10日
szw123456789 LV1
2022年11月13日
萌新不想挨打
2022年7月23日
暂无贡献等级