• java视频格式转换代码


    http://blog.163.com/zzf_fly/blog/static/20958915820127217443816/

    package com.gkzx.online.action;

    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;

    import org.apache.struts2.ServletActionContext;

    /*
     * Title:FLV视频转换类
     * @author 郑忠飞
     * 2012-08-21
     */

    public class Conver {
     
     
     private Date dt;
     private long begintime;
     private String PATH;
     private String filerealname; // 文件名 不包括扩展名
     private String filename; // 包括扩展名
     private String videofolder = null; // 别的格式视频的目录
     private String flvfolder = null;// 转化为flv视频的存放目录
     private final static String FFMPEGPATH = "/DownLoad/ffmpeg"; // ffmpeg.exe的目录
     private final static String MENCODERPATH = "/DownLoad"; // ffmpeg.exe的目录
     

     // private String videoRealPath = "D:/ffmpeg/flv/"; // 截图的视频目录;
     // private String imageRealPath = "D:/ffmpeg/img/"; // 截图的存放目录
     public Conver(String otherpath,String flvpath){
      this.PATH = otherpath;//其他类型的视频文件文件夹
      this.flvfolder = flvpath;//转换成为flv的格式之后视频存放的路径
     }
     /**
      * 对视频格式进行转换
      *
      * @author 郑忠飞 2012-08-21
      */
     public boolean beginConver() {
      File fi = new File(PATH);
      filename = fi.getName();
      filerealname = filename.substring(0, filename.lastIndexOf("."))
        .toLowerCase();
      String videofolderTemp = PATH.substring(0,PATH.lastIndexOf("\"));
      videofolder = videofolderTemp.replace("flash", "other");
      System.out.println("----接收到文件(" + PATH
        + ")需要转换-------------------------- ");
      if (!checkfile(PATH)) {
       System.out.println(PATH + "文件不存在" + " ");
       return false;
      }
      dt = new Date();
      begintime = dt.getTime();
      System.out.println("----开始转文件(" + PATH
        + ")-------------------------- ");
      if (process()) {
       Date dt2 = new Date();
       System.out.println("转换成功 ");
       long endtime = dt2.getTime();
       long timecha = (endtime - begintime);
       String totaltime = sumTime(timecha);
       System.out.println("共用了:" + totaltime + " ");
       /*
        * if(processImg()) { Conver.OutShowLog.append("截图成功了 "); }else {
        * Conver.OutShowLog.append("截图不成功了 "); }
        */
       PATH = null;
       return true;
      } else {
       PATH = null;
       return false;
      }
     }

     /**
      * 检查文件时否存在
      *
      * @param path
      * @return
      */
     private boolean checkfile(String path) {
      File file = new File(path);
      if (!file.isFile()) {
       return false;
      } else {
       return true;
      }
     }

     /**
      * 计算视频转换总时间
      */
     public String sumTime(long ms) {
      int ss = 1000;
      long mi = ss * 60;
      long hh = mi * 60;
      long dd = hh * 24;

      long day = ms / dd;
      long hour = (ms - day * dd) / hh;
      long minute = (ms - day * dd - hour * hh) / mi;
      long second = (ms - day * dd - hour * hh - minute * mi) / ss;
      long milliSecond = ms - day * dd - hour * hh - minute * mi - second
        * ss;

      String strDay = day < 10 ? "0" + day + "天" : "" + day + "天";
      String strHour = hour < 10 ? "0" + hour + "/小时" : "" + hour + "小时";
      String strMinute = minute < 10 ? "0" + minute + "分" : "" + minute + "分";
      String strSecond = second < 10 ? "0" + second + "秒" : "" + second + "秒";
      String strMilliSecond = milliSecond < 10 ? "0" + milliSecond : ""
        + milliSecond;
      strMilliSecond = milliSecond < 100 ? "0" + strMilliSecond + "毫秒" : ""
        + strMilliSecond + " 毫秒";
      return strDay + strHour + ":" + strMinute + ":" + strSecond + " "
        + strMilliSecond;

     }

     private boolean process() {
      int type = checkContentType();
      boolean status = false;
      if (type == 0) { // 如果视频的格式ffmpag可以直接转换
       status = processFLV(PATH); // 直接将文件转为flv文件
      } else if (type == 1) {
       String avifilepath = processAVI(type);
       if (avifilepath == null)
        return false;
       // avi文件没有得到
       else {
        System.out.println("开始转换");
        status = processFLV(avifilepath);// 将avi转为flv
       }
      }
      return status;
     }

     /**
      * 检查视频的格式 方法说明:如果视频的格式可以直接转换那么返回为0; 如果视频的格式不可以转换那么返回为1;
      */
     private int checkContentType() {
      String type = PATH.substring(PATH.lastIndexOf(".") + 1, PATH.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无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
     @SuppressWarnings({ "deprecation", "unchecked" })
     private String processAVI(int type) {
      String mencoderEXEDir = ServletActionContext.getRequest().getRealPath(MENCODERPATH)
        + File.separator + "mencoder.exe";;
      List commend = new java.util.ArrayList();
      commend.add(mencoderEXEDir);
      commend.add(PATH);
      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(videofolder +"\"+ filerealname + ".avi");
      try {
       ProcessBuilder builder = new ProcessBuilder();
       builder.command(commend);
       Process p = builder.start();

       doWaitFor(p);
       return videofolder + "\" +filerealname + ".avi";
      } catch (Exception e) {
       e.printStackTrace();
       return null;
      }
     }

     // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
     @SuppressWarnings({ "unchecked", "deprecation" })
     private boolean processFLV(String oldfilepath) {
      //ffmpeg.exe的位置
      String videoEXEDir = ServletActionContext.getRequest().getRealPath(
        FFMPEGPATH)
        + File.separator + "ffmpeg.exe";
      if (!checkfile(PATH)) {
       System.out.println(oldfilepath + " is not file");
       return false;
      }

      List commend = new java.util.ArrayList();
      commend.add(videoEXEDir);
      commend.add("-i");
      commend.add(oldfilepath);
      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("-b");
      commend.add("521");
      commend.add("-y");
      commend.add(flvfolder + "\" +filerealname + ".flv");
      // 低品质:ffmpeg -i infile -ab 128 -acodec libmp3lame -ac 1 -ar 22050 -r
      // 29.97 -b 512 -y outfile

      try {
       ProcessBuilder builder = new ProcessBuilder();
       builder.command(commend);
       // builder.redirectErrorStream(true);
       Process p = builder.start();
       doWaitFor(p);
       p.destroy();
       deleteFile(oldfilepath);
       return true;
      } catch (Exception e) {
       e.printStackTrace();
       return false;
      }
     }

     @SuppressWarnings("static-access")
     public int doWaitFor(Process p)

     {
      InputStream in = null;
      InputStream err = null;
      int exitValue = -1; // returned to caller when p is finished
      try {
       System.out.println("comeing");
       in = p.getInputStream();
       err = p.getErrorStream();
       boolean finished = false; // Set to true when p is finished

       while (!finished) {
        try {
         while (in.available() > 0) {
          // Print the output of our system call
          Character c = new Character((char) in.read());
          System.out.print(c);//使用缓存技术
         }
         while (err.available() > 0) {
          // Print the output of our system call
          Character c = new Character((char) err.read());
          System.out.print(c);
         }

         // Ask the process for its exitValue. If the process
         // is not finished, an IllegalThreadStateException
         // is thrown. If it is finished, we fall through and
         // the variable finished is set to true.
         exitValue = p.exitValue();
         finished = true;

        } catch (IllegalThreadStateException e) {
         // Process is not finished yet;
         // Sleep a little to save on CPU cycles
         Thread.currentThread().sleep(500);
        }
       }
      } catch (Exception e) {
       // unexpected exception! print it out for debugging...
       System.err.println("doWaitFor();: unexpected exception - "
         + e.getMessage());
      } finally {
       try {
        if (in != null) {
         in.close();
        }

       } catch (IOException e) {
        System.out.println(e.getMessage());
       }
       if (err != null) {
        try {
         err.close();
        } catch (IOException e) {
         System.out.println(e.getMessage());
        }
       }
      }
      // return completion status to caller
      return exitValue;
     }

     /**
      * 删除文件
      *
      * @param filepath
      */
     public void deleteFile(String filepath) {
      File file = new File(filepath);
      if (PATH.equals(filepath)) {
       if (file.delete()) {
        System.out.println("文件" + filepath + "已删除");
       }
      } else {
       if (file.delete()) {
        System.out.println("文件" + filepath + "已删除 ");
       }
       File filedelete2 = new File(PATH);
       if (filedelete2.delete()) {
        System.out.println("文件" + PATH + "已删除");
       }
      }
     }
    }

  • 相关阅读:
    默认使用什么序列化框架,你知道的还有哪些?
    一般使用什么注册中心?还有别的选择吗?
    Dubbo 的整体架构设计有哪些分层?
    Java 中是如何支持正则表达式操作的?
    Dubbo 集群容错有几种方案?
    Dubbo 推荐用什么协议?
    说说核心的配置有哪些?
    Dubbo 如何优雅停机?
    Dubbo 必须依赖的包有哪些?
    服务上线怎么兼容旧版本?
  • 原文地址:https://www.cnblogs.com/alps/p/5601492.html
Copyright © 2020-2023  润新知