java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二)

2024-03-13 21:08

本文主要是介绍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

/*** 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.判断文件的类型,从而调用不同的解析工具

 
 /*** 判断文件的类型,从而调用不同的解析工具* @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 将源文件转换成其他格式 

/*** 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 视频文件(新)* @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 将源文件转换成其他格式 (自定义执行的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(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/806202

相关文章

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下