本文主要是介绍java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
请看:java 实现视频转换通用工具类:获取视频元数据信息(一)
1.自动判断格式并调用相应的转换工具,默认方法
/*** 自动判断格式并调用相应的转换工具,默认方法* @param srcVideoPath* @param tarVideoPath* @return*/public static boolean videoConver(String srcVideoPath,String tarVideoPath){boolean boo = true;if(StringUtils.isNotEmpty(srcVideoPath) && StringUtils.isNotEmpty(tarVideoPath)){srcVideoPath = BaseCommonUtil.replaceFliePathStr(srcVideoPath);srcVideoPath = srcVideoPath.replaceAll("//", "/");tarVideoPath = BaseCommonUtil.replaceFliePathStr(tarVideoPath);tarVideoPath = tarVideoPath.replaceAll("//", "/");String extendName = srcVideoPath.substring(srcVideoPath.lastIndexOf(".")+1,srcVideoPath.length());String extendTarName = tarVideoPath.substring(tarVideoPath.lastIndexOf(".")+1,tarVideoPath.length());//判断元资源是不是MP4格式,如果是则直接复制if("MP4".equals(extendName.toUpperCase())){try{if(!srcVideoPath.equals(tarVideoPath)){copyFile(new File(srcVideoPath),new File(tarVideoPath));}}catch(IOException e){boo=false;logger.error("文件复制失败!",e);}}else{// 直接用ffmpeg转换,如果不能转换则用mencoder转换boo = processFfmpegOther(srcVideoPath, tarVideoPath);if (!boo) {boo = processMencoderOther(srcVideoPath, tarVideoPath);if (!boo) {logger.error(" videoConver 暂不支持该格式!");boo = false;}}}if("MP4".equals(extendTarName.toUpperCase())){boo = execMp4Box(tarVideoPath);}}return boo;}
2.Mp4Box 转换MP4
/*** 自动判断格式并调用相应的转换工具,默认方法* @param srcVideoPath* @param tarVideoPath* @return*/public static boolean videoConver(String srcVideoPath,String tarVideoPath){boolean boo = true;if(StringUtils.isNotEmpty(srcVideoPath) && StringUtils.isNotEmpty(tarVideoPath)){srcVideoPath = BaseCommonUtil.replaceFliePathStr(srcVideoPath);srcVideoPath = srcVideoPath.replaceAll("//", "/");tarVideoPath = BaseCommonUtil.replaceFliePathStr(tarVideoPath);tarVideoPath = tarVideoPath.replaceAll("//", "/");String extendName = srcVideoPath.substring(srcVideoPath.lastIndexOf(".")+1,srcVideoPath.length());String extendTarName = tarVideoPath.substring(tarVideoPath.lastIndexOf(".")+1,tarVideoPath.length());//判断元资源是不是MP4格式,如果是则直接复制if("MP4".equals(extendName.toUpperCase())){try{if(!srcVideoPath.equals(tarVideoPath)){copyFile(new File(srcVideoPath),new File(tarVideoPath));}}catch(IOException e){boo=false;logger.error("文件复制失败!",e);}}else{// 直接用ffmpeg转换,如果不能转换则用mencoder转换boo = processFfmpegOther(srcVideoPath, tarVideoPath);if (!boo) {boo = processMencoderOther(srcVideoPath, tarVideoPath);if (!boo) {logger.error(" videoConver 暂不支持该格式!");boo = false;}}}if("MP4".equals(extendTarName.toUpperCase())){boo = execMp4Box(tarVideoPath);}}return boo;}
/*** Mp4Box 转换MP4* @param srcPath 源MP4路径* @return*/public static boolean execMp4Box(String srcPath){if (!checkfile(srcPath)) { logger.error("【" + srcPath + "】 不存在 !"); return false; } try { Process process = Runtime.getRuntime().exec(mp4BoxPath + " -isma " + srcPath);doWaitFor(process); process.destroy(); if (!checkfile(srcPath)) { logger.error("【" + srcPath + "】 execMp4Box 转换MP4 metadata 不成功 !");return false; } return true; } catch (Exception e) { logger.error("【" + srcPath + "】execMp4Box 转换MP4 metadata 不成功 !",e);return false; } }
3.判断文件的类型,从而调用不同的解析工具
/*** Mp4Box 转换MP4* @param srcPath 源MP4路径* @return*/public static boolean execMp4Box(String srcPath){if (!checkfile(srcPath)) { logger.error("【" + srcPath + "】 不存在 !"); return false; } try { Process process = Runtime.getRuntime().exec(mp4BoxPath + " -isma " + srcPath);doWaitFor(process); process.destroy(); if (!checkfile(srcPath)) { logger.error("【" + srcPath + "】 execMp4Box 转换MP4 metadata 不成功 !");return false; } return true; } catch (Exception e) { logger.error("【" + srcPath + "】execMp4Box 转换MP4 metadata 不成功 !",e);return false; } }
/*** 判断文件的类型,从而调用不同的解析工具* @return filePath*/public static int checkContentType(String filePath) { String type = filePath.substring(filePath.lastIndexOf(".") + 1, filePath.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; // 对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; } else if (type.equals("swf")) { return 2; }return 9; }
4.Mencoder 将源文件转换成其他格式
/*** 判断文件的类型,从而调用不同的解析工具* @return filePath*/public static int checkContentType(String filePath) { String type = filePath.substring(filePath.lastIndexOf(".") + 1, filePath.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; // 对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; } else if (type.equals("swf")) { return 2; }return 9; }
/*** Mencoder 将源文件转换成其他格式 * 如:wmv9,rm,rmvb* @param srcVideoPath 视频文件(原)* @param tarVideoPath 视频文件(新)* @return*/public static boolean processMencoderOther(String srcVideoPath,String tarVideoPath) { if (!checkfile(srcVideoPath)) { logger.error("【" + srcVideoPath + "】 不存在 !");return false; } List<String> commend = new java.util.ArrayList<String>(); commend.add(mencoderPath); commend.add(srcVideoPath); // 音频采用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"); commend.add("-lameopts"); commend.add("vbr=3:br=128"); commend.add("-o"); commend.add(tarVideoPath); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); Process process = builder.start(); doWaitFor(process); process.destroy(); if (!checkfile(tarVideoPath)) { logger.info(srcVideoPath + " is not exit! processMencoderOther 转换不成功 !");return false; } return true;} catch (Exception e) { logger.error("【" + srcVideoPath + "】 processMencoderOther 转换不成功 !");return false;} }
5.Mencoder 将源文件转换成其他格式
/*** Mencoder 将源文件转换成其他格式 * 如:wmv9,rm,rmvb* @param srcVideoPath 视频文件(原)* @param tarVideoPath 视频文件(新)* @return*/public static boolean processMencoderOther(String srcVideoPath,String tarVideoPath) { if (!checkfile(srcVideoPath)) { logger.error("【" + srcVideoPath + "】 不存在 !");return false; } List<String> commend = new java.util.ArrayList<String>(); commend.add(mencoderPath); commend.add(srcVideoPath); // 音频采用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"); commend.add("-lameopts"); commend.add("vbr=3:br=128"); commend.add("-o"); commend.add(tarVideoPath); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); Process process = builder.start(); doWaitFor(process); process.destroy(); if (!checkfile(tarVideoPath)) { logger.info(srcVideoPath + " is not exit! processMencoderOther 转换不成功 !");return false; } return true;} catch (Exception e) { logger.error("【" + srcVideoPath + "】 processMencoderOther 转换不成功 !");return false;} }
/*** Mencoder 将源文件转换成其他格式 * 如:wmv9,rm,rmvb* @param srcVideoPath 视频文件(原)* @param tarVideoPath 视频文件(新)* @param startTime 开始时间 形如:10秒* @param endTime 结束时间 形如:120秒* @return*/public static boolean processMencoderByTime(String srcVideoPath,String tarVideoPath,String startTime,String endTime) { if (!checkfile(srcVideoPath)) { logger.error("【" + srcVideoPath + "】 不存在 !");return false; } List<String> commend = new java.util.ArrayList<String>(); commend.add(mencoderPath); commend.add(srcVideoPath); // 音频采用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"); commend.add("-ss"); if(startTime != null && !startTime.equals("")){commend.add(getSplitStr(startTime));}else{commend.add("0");//默认从开始转换}commend.add("-endpos"); if(endTime != null && !endTime.equals("")){commend.add((Long.parseLong(getSplitStr(endTime))-Long.parseLong(getSplitStr(startTime)))+"");}else{//VedioInfoHelps.getVideoInfo(srcVideoPath,"playingAllTime");commend.add("600");//默认为60秒=10分钟}/* * 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(tarVideoPath); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); Process process = builder.start(); doWaitFor(process); process.destroy(); if (!checkfile(tarVideoPath)) { logger.info(tarVideoPath + " is not exit! processMencoderByTime 转换不成功 !");return false; } return true;} catch (Exception e) { logger.error("【" + srcVideoPath + "】 processMencoderByTime 转换不成功 !",e);return false;} }
6.Mencoder 将源文件转换成其他格式 (自定义执行的shell):
/*** Mencoder 将源文件转换成其他格式 * 如:wmv9,rm,rmvb* @param srcVideoPath 视频文件(原)* @param tarVideoPath 视频文件(新)* @param startTime 开始时间 形如:10秒* @param endTime 结束时间 形如:120秒* @return*/public static boolean processMencoderByTime(String srcVideoPath,String tarVideoPath,String startTime,String endTime) { if (!checkfile(srcVideoPath)) { logger.error("【" + srcVideoPath + "】 不存在 !");return false; } List<String> commend = new java.util.ArrayList<String>(); commend.add(mencoderPath); commend.add(srcVideoPath); // 音频采用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"); commend.add("-ss"); if(startTime != null && !startTime.equals("")){commend.add(getSplitStr(startTime));}else{commend.add("0");//默认从开始转换}commend.add("-endpos"); if(endTime != null && !endTime.equals("")){commend.add((Long.parseLong(getSplitStr(endTime))-Long.parseLong(getSplitStr(startTime)))+"");}else{//VedioInfoHelps.getVideoInfo(srcVideoPath,"playingAllTime");commend.add("600");//默认为60秒=10分钟}/* * 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(tarVideoPath); try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); Process process = builder.start(); doWaitFor(process); process.destroy(); if (!checkfile(tarVideoPath)) { logger.info(tarVideoPath + " is not exit! processMencoderByTime 转换不成功 !");return false; } return true;} catch (Exception e) { logger.error("【" + srcVideoPath + "】 processMencoderByTime 转换不成功 !",e);return false;} }
/*** Mencoder 将源文件转换成其他格式 (自定义执行的shell):* 例如:mencoder -i 03.flv 03.avi * @param prefix 前缀* @param srcVideoPath 视频文件(原)* @param middlefix 中间的字符转* @param srcVideoPath 视频文件(转换后的路径) * @param suffix 结束的字符串* @return*/public static boolean processMencoderShellScript(String prefix,String srcVideoPath,String middlefix,String tarVideoPath,String suffix) { if (!checkfile(srcVideoPath)) { logger.error("【" + srcVideoPath + "】 不存在 !");return false; } List<String> commend = new java.util.ArrayList<String>(); commend.add(mencoderPath); if(prefix != null && !prefix.equals("")){commend.add(prefix); }commend.add(srcVideoPath); if(middlefix != null && !middlefix.equals("")){commend.add(middlefix); }commend.add(tarVideoPath); if(suffix != null && !suffix.equals("")){commend.add(suffix); }try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); Process process = builder.start(); doWaitFor(process); process.destroy(); if (!checkfile(tarVideoPath)) { logger.info(tarVideoPath + " is not exit! processMencoderShellScript 转换不成功 !");return false; } return true; } catch (Exception e) { logger.error("【" + srcVideoPath + "】 processMencoderShellScript 转换不成功 !");return false; } }
/*** Mencoder 将源文件转换成其他格式 (自定义执行的shell):* 例如:mencoder -i 03.flv 03.avi * @param prefix 前缀* @param srcVideoPath 视频文件(原)* @param middlefix 中间的字符转* @param srcVideoPath 视频文件(转换后的路径) * @param suffix 结束的字符串* @return*/public static boolean processMencoderShellScript(String prefix,String srcVideoPath,String middlefix,String tarVideoPath,String suffix) { if (!checkfile(srcVideoPath)) { logger.error("【" + srcVideoPath + "】 不存在 !");return false; } List<String> commend = new java.util.ArrayList<String>(); commend.add(mencoderPath); if(prefix != null && !prefix.equals("")){commend.add(prefix); }commend.add(srcVideoPath); if(middlefix != null && !middlefix.equals("")){commend.add(middlefix); }commend.add(tarVideoPath); if(suffix != null && !suffix.equals("")){commend.add(suffix); }try { ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); Process process = builder.start(); doWaitFor(process); process.destroy(); if (!checkfile(tarVideoPath)) { logger.info(tarVideoPath + " is not exit! processMencoderShellScript 转换不成功 !");return false; } return true; } catch (Exception e) { logger.error("【" + srcVideoPath + "】 processMencoderShellScript 转换不成功 !");return false; } }
这篇关于java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!