자바 비디오 형식 전환 의 실현 방법

본 논문 의 사례 는 자바 영상 형식 전환 의 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
핵심 은 ffmpeg 를 이용 하여 영상 변환 을 하 는 것 이다.우 리 는 영상 변환 코드 를 쓰 지 않 고 ffmpeg 만 호출 하면 영상의 전환 을 완성 할 수 있다.ffmpeg 지원 유형 은 asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv 등 이 있 습 니 다.이러한 유형 은 ffmpeg 를 이용 하여 직접 전환 할 수 있 습 니 다.ffmpeg 가 지원 하지 않 는 유형 은 wmv 9,rm,rmvb 등 이 있 습 니 다.이 유형 들 은 다른 도구(mencoder)로 avi(ffmpeg 가 해석 할 수 있 는)형식 으로 변환 해 야 합 니 다.
쓸데없는 말 은 많이 하지 않 는 다.우선 관련 라 이브 러 리 와 전환 할 동 영상 을 준비 해 야 한다.다음 과 같다.
 
다음은 코드 부분 입 니 다.   

package com.sino.test; 
 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.List; 
 
/** 
 * java          
 * @author liuyazhuang 
 * 
 */ 
public class ChangeVideo { 
  public static void main(String[] args) { 
    ChangeVideo.convert("d:\\myeclipse\\aa.avi", "d:\\myeclipse\\bb.mp4"); 
  } 
 
  /** 
   * @param inputFile:        
   * @param outputFile:      w 
   * @return 
   */ 
  public static boolean convert(String inputFile, String outputFile) { 
    if (!checkfile(inputFile)) { 
      System.out.println(inputFile + " is nokt file"); 
      return false; 
    } 
    if (process(inputFile, outputFile)) { 
      System.out.println("ok"); 
      return true; 
    } 
    return false; 
  } 
 
  //          
  private static boolean checkfile(String path) { 
    File file = new File(path); 
    if (!file.isFile()) { 
      return false; 
    } 
    return true; 
  } 
 
  /** 
   * @param inputFile 
   * @param outputFile 
   * @return 
   *        
   */ 
  private static boolean process(String inputFile, String outputFile) { 
    int type = checkContentType(inputFile); 
    boolean status = false; 
    if (type == 0) { 
      status = processFLV(inputFile, outputFile);//        flv   
    } else if (type == 1) { 
      String avifilepath = processAVI(type, inputFile); 
      if (avifilepath == null) 
        return false;// avi       
      status = processFLV(avifilepath, outputFile);//  avi  flv 
    } 
    return status; 
  } 
 
  private static int checkContentType(String inputFile) { 
    String type = inputFile.substring(inputFile.lastIndexOf(".") + 1, 
        inputFile.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; 
    } 
    return 9; 
  } 
  // ffmpeg      :(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv )          
  private static boolean processFLV(String inputFile, String outputFile) { 
    if (!checkfile(inputFile)) { 
      System.out.println(inputFile + " is not file"); 
      return false; 
    } 
    List<String> commend = new ArrayList<String>(); 
     
    commend.add(Constants.ffmpegPath); 
    commend.add("-i"); 
    commend.add(inputFile); 
    commend.add("-ab"); 
    commend.add("128"); 
    commend.add("-acodec"); 
    commend.add("libmp3lame"); 
    commend.add("-ac"); 
    commend.add("1"); 
    commend.add("-ar"); 
    commend.add("22050"); 
    commend.add("-r"); 
    commend.add("29.97"); 
    //     
    commend.add("-qscale"); 
    commend.add("6"); 
    //    
//   commend.add("-b"); 
//   commend.add("512"); 
    commend.add("-y"); 
     
    commend.add(outputFile); 
    StringBuffer test = new StringBuffer(); 
    for (int i = 0; i < commend.size(); i++) { 
      test.append(commend.get(i) + " "); 
    } 
 
    System.out.println(test); 
 
    try { 
      ProcessBuilder builder = new ProcessBuilder(); 
      builder.command(commend); 
      builder.start(); 
      return true; 
    } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
    } 
  } 
  //  ffmpeg         (wmv9,rm,rmvb ), 
  //         (mencoder)   avi(ffmpeg    )  . 
  private static String processAVI(int type, String inputFile) { 
    File file = new File(Constants.avifilepath); 
    if (file.exists()) 
      file.delete(); 
    List<String> commend = new ArrayList<String>(); 
    commend.add(Constants.mencoderPath); 
    commend.add(inputFile); 
    commend.add("-oac"); 
    commend.add("mp3lame"); 
    commend.add("-lameopts"); 
    commend.add("preset=64"); 
    commend.add("-ovc"); 
    commend.add("xvid"); 
    commend.add("-xvidencopts"); 
    commend.add("bitrate=600"); 
    commend.add("-of"); 
    commend.add("avi"); 
    commend.add("-o"); 
    commend.add(Constants.avifilepath); 
    StringBuffer test = new StringBuffer(); 
    for (int i = 0; i < commend.size(); i++) { 
      test.append(commend.get(i) + " "); 
    } 
 
    System.out.println(test); 
    try { 
      ProcessBuilder builder = new ProcessBuilder(); 
      builder.command(commend); 
      Process p = builder.start(); 
 
      final InputStream is1 = p.getInputStream(); 
      final InputStream is2 = p.getErrorStream(); 
      new Thread() { 
        public void run() { 
          BufferedReader br = new BufferedReader( 
              new InputStreamReader(is1)); 
          try { 
            String lineB = null; 
            while ((lineB = br.readLine()) != null) { 
              if (lineB != null) 
                System.out.println(lineB); 
            } 
          } catch (IOException e) { 
            e.printStackTrace(); 
          } 
        } 
      }.start(); 
      new Thread() { 
        public void run() { 
          BufferedReader br2 = new BufferedReader( 
              new InputStreamReader(is2)); 
          try { 
            String lineC = null; 
            while ((lineC = br2.readLine()) != null) { 
              if (lineC != null) 
                System.out.println(lineC); 
            } 
          } catch (IOException e) { 
            e.printStackTrace(); 
          } 
        } 
      }.start(); 
 
      //  Mencoder      ,   ffmepg   
      p.waitFor(); 
      System.out.println("who cares"); 
      return Constants.avifilepath; 
    } catch (Exception e) { 
      System.err.println(e); 
      return null; 
    } 
  } 
} 
 클래스 Change Video 는 주로 영상 형식의 전환 을 진행 합 니 다.

package com.sino.test; 
 
/** 
 *    ,                                   
 * @author liuyazhuang 
 * 
 */ 
public class Constants { 
  //ffmpeg      
  public static final String ffmpegPath = "d:\\myeclipse\\ffmpeg.exe"; 
  //mencoder      
  public static final String mencoderPath = "d:\\myeclipse\\mencoder.exe"; 
  //  mencoder    avi     
  public static final String avifilepath = "d:\\myeclipse\\temp.avi"; 
} 

상수 클래스 Constants 는 실행 가능 한 프로그램 과 동적 링크 라 이브 러 리,전환 과정 에서 생 성 된 임시 영상 파일 의 위 치 를 설정 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기