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

Java 实现视频转FLV,支持完成进度百分比

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

视频转换主要采用ffmpeg,下载去官网即可

转换主程序:

注:以下标粗的 ffmpeg 是 绝对路径如:D:/conver/ffmpeg-win.exe

/**
     * 
     * @Title: processFLV 
     * @Description: 转FLV格式
     *  ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
     * @param   
     * @return boolean 
     * @throws
     */
    private static boolean coverToFLV(String srcVideoPath,String tarVideoPath) {
      if (!checkfile(srcVideoPath)) {  
         logger.error("【" + srcVideoPath + "】  不存在 !");
         return false;  
      } 
      List<String> commend = new java.util.ArrayList<String>();
      commend.add(ffmpegPath);
      commend.add( "-y");  
      commend.add( "-i"); 
      commend.add(srcVideoPath);
      commend.add("-ab");
      commend.add("64");
      //commend.add("-sameq");
      commend.add("-acodec");
      commend.add("mp3");
//      commend.add("-vcodec");
//      commend.add("xvid");
      commend.add("-ac");
      commend.add("2");
      commend.add("-ar");
      commend.add("22050");
      commend.add("-qscale");
      commend.add("6"); //压缩大小
//      commend.add("-b");
//      commend.add("1500");
      commend.add("-r");
      commend.add("24");
      commend.add(tarVideoPath);
      try {
	       ProcessBuilder builder = new ProcessBuilder();
	       //String cmd = commend.toString();
	       builder.command(commend);
	       Process p = builder.start();
	       doWaitPro(p);
	       //doWaitFor(p);
	       p.destroy();
	       return true;
      } catch (Exception e) {
    	  e.printStackTrace();
    	  return false;
      }
    }


等待线程完成:

//等待线程处理完成
    public static void doWaitPro(Process p){
		try {
			String errorMsg = readInputStream(p.getErrorStream(), "error");
			String outputMsg = readInputStream(p.getInputStream(), "out"); 
			   int c = p.waitFor();  
			   if (c != 0) {// 如果处理进程在等待  
				   System.out.println("处理失败:" + errorMsg);  
			   } else {  
				   System.out.println(COMPLETE + outputMsg);  
			   }  
		} catch (IOException e) {
			// tanghui Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// tanghui Auto-generated catch block
			e.printStackTrace();
		}  
		   
    }

完成进度百分比:

/**
       * 
       * @Title: readInputStream 
       * @Description: 完成进度百分比
       * @param   
       * @return String 
       * @throws
       */
       private static String readInputStream(InputStream is, String f) throws IOException {  
	        // 将进程的输出流封装成缓冲读者对象  
	        BufferedReader br = new BufferedReader(new InputStreamReader(is));  
	        StringBuffer lines = new StringBuffer();// 构造一个可变字符串  
	        long totalTime = 0;  
	        
	        // 对缓冲读者对象进行每行循环  
	        for (String line = br.readLine(); line != null; line = br.readLine()) {  
	         lines.append(line);// 将每行信息字符串添加到可变字符串中  
	         int positionDuration = line.indexOf("Duration:");// 在当前行中找到第一个"Duration:"的位置  
	         int positionTime = line.indexOf("time=");  
	         if (positionDuration > 0) {// 如果当前行中有"Duration:"  
	          String dur = line.replace("Duration:", "");// 将当前行中"Duration:"替换为""  
	          dur = dur.trim().substring(0, 8);// 将替换后的字符串去掉首尾空格后截取前8个字符  
	          int h = Integer.parseInt(dur.substring(0, 2));// 封装成小时  
	          int m = Integer.parseInt(dur.substring(3, 5));// 封装成分钟  
	          int s = Integer.parseInt(dur.substring(6, 8));// 封装成秒  
	          totalTime = h * 3600 + m * 60 + s;// 得到总共的时间秒数  
	         }  
	         if (positionTime > 0) {// 如果所用时间字符串存在  
	          // 截取包含time=的当前所用时间字符串  
	          String time = line.substring(positionTime, line  
	            .indexOf("bitrate") - 1);  
	          time = time.substring(time.indexOf("=") + 1, time.indexOf("."));// 截取当前所用时间字符串  
	          int h = Integer.parseInt(time.substring(0, 2));// 封装成小时  
	          int m = Integer.parseInt(time.substring(3, 5));// 封装成分钟  
	          int s = Integer.parseInt(time.substring(6, 8));// 封装成秒  
	          long hasTime = h * 3600 + m * 60 + s;// 得到总共的时间秒数 
	          float t = (float) hasTime / (float) totalTime;// 计算所用时间与总共需要时间的比例  
	          COMPLETE = (int) Math.ceil(t * 100);// 计算完成进度百分比  
	         }  
	         	System.out.println("完成:" + COMPLETE + "%");  
	        }  
	        br.close();// 关闭进程的输出流  
	        return lines.toString();  
       }  

抱歉!评论已关闭.