现在的位置: 首页 > 综合 > 正文

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

2018年01月27日 ⁄ 综合 ⁄ 共 7062字 ⁄ 字号 评论关闭

请看: 

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

抱歉!评论已关闭.