java视频转换器_java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二) java 实现视频转换通用工具类:获取视频元数据信息(一) ...

本文介绍了如何通过Java实现自动检测视频格式并调用FFmpeg或Mencoder进行转换,包括MP4的直接复制、不同格式的转换策略,以及使用 Mp4Box 修复MP4元数据。重点展示了检查文件类型、使用Mencoder进行格式转换和时间截取的示例代码。
摘要由CSDN通过智能技术生成

请看:

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 commend = new java.util.ArrayList();

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 commend = new java.util.ArrayList();

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 commend = new java.util.ArrayList();

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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值