您的位置:首页 > 编程语言 > Java开发

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

2013-09-12 09:49 721 查看
请看:


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;
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: