Blog / 阅读

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

by admin on 2014-04-22 14:23:39 in ,



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


转换主程序:


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


[java] view plaincopy
<span style="font-size:14px;">/** 
     *  
     * @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(</span><strong><span style="font-size:18px;">ffmpegPath</span></strong><span style="font-size:14px;">);  
      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;  
      }  
    }</span>  




等待线程完成:


[java] view plaincopy
//等待线程处理完成  
    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();  
        }    
             
    }  


完成进度百分比:


[java] view plaincopy
/** 
       *  
       * @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();    
       }    



写评论

相关文章

上一篇:java jna调用迅雷接口下载

下一篇:DES加密算法详解- -

评论

写评论

* 必填.

分享

栏目

赞助商


热门文章

Tag 云