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
    + ")需要转换-------------------------- \n");
  if (!checkfile(PATH)) {
   System.out.println(PATH + "文件不存在" + " ");
   return false;
  }
  dt = new Date();
  begintime = dt.getTime();
  System.out.println("----开始转文件(" + PATH
    + ")-------------------------- \n");
  if (process()) {
   Date dt2 = new Date();
   System.out.println("转换成功 \n");
   long endtime = dt2.getTime();
   long timecha = (endtime - begintime);
   String totaltime = sumTime(timecha);
   System.out.println("共用了:" + totaltime + " ");
   /*
    * if(processImg()) { Conver.OutShowLog.append("截图成功了 \n"); }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 + "已删除");
   }
  }
 }
}

java视频格式转换代码的更多相关文章

  1. java视频格式转换

    项目中需要对各种视频格式转码为mp4格式,试了好多办法,最后使用ffmpeg 工具完美转码,ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) 链接 ...

  2. C#使用FFmpeg 将视频格式转换成Gif图片示例

    根据EFmpeg封装的视频转换gif工具:https://my.oschina.net/tianma3798/blog/825317 一.本次使用参数说明 /* * 参数说明: * -i 源文件位置 ...

  3. Unity 利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能

    目录 一.FFmpeg简介. 二.FFmpeg常用参数及命令. 三.FFmpeg在Unity 3D中的使用. 1.FFmpeg 录屏. 2.FFmpeg 推流. 3.FFmpeg 其他功能简述. 一. ...

  4. Ubuntu18.04下使用Blender进行视频格式转换

    Ubuntu下可以使用Blender的Video Editing功能进行视频格式转换, 具体步骤: 打开Blender后, 在顶层菜单栏中, 将Choose Screen Layout修改为Video ...

  5. Java日期格式转换

    Java时间格式转换大全 import java.text.*;import java.util.Calendar;public class VeDate {/**   * 获取现在时间   *    ...

  6. 视频格式转换.ZC资料

    1.20191013: ZC:这些都是 2015年做的尝试,之前貌似没有记录下来,现在 再次用到,把用到的记录下来: ZC: (1) 使用的视频格式转换工具是 "??/XiGua Yings ...

  7. iSkysoft iMedia Converter Deluxe Mac如何制作视频?视频格式转换工具制作动图的方法

    使用iSkysoft iMedia Converter Deluxe Mac如何制作视频?使用视频格式转换工具,你可以轻松进行动图或视频的制作,也可以把你喜欢的视频的某一段提取出来,制作成你自己风格的 ...

  8. Java 实现金额转换 代码示例

    金额转换,阿拉伯数字的金额转换成中国传统的形式如: (¥1011)→(壹仟零壹拾壹元整)输出. 分析: 金额转换,在开发财务相关软件时会经常用到,也是软件本地化的一个需要.一般开发公司或者团队都有相应 ...

  9. 完整的java字符串编码转换代码

    package book.String; import java.io.UnsupportedEncodingException; /** *//** * 转换字符串的编码 * @author joe ...

随机推荐

  1. Java过滤器应用-对Ajax请求做Session失效判断

    过滤器常用来对Session过期做判断 Layout.js 1.为ajax请求添加标识 2.无论ajax请求成功与否,complete函数终会执行 // 全局Ajax设置, 用于session过期后的 ...

  2. 【Java】集合(List、Set)遍历、判断、删除元素时的小陷阱

    开发中,常有场景:遍历集合,依次判断是否符合条件,如符合条件则删除当前元素. 不知不觉中,有些陷阱,不知你有没有犯. 一.漏网之鱼-for循环递增下标方式遍历集合,并删除元素 如果你用for循环递增下 ...

  3. CurlSharp

    https://github.com/masroore/CurlSharp clone版本库之后,在本地使用,会遇到找不到dll的情况 编译EasyGet项目之后,进行调试,会提示 System.Ba ...

  4. Date Picker Calendar For Oracle Forms 6i

    Giving date picker calendar option to user for date type fields in Oracle Forms. I am providing you ...

  5. [HDOJ5726]GCD(RMQ,二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5726 题意:给定数列,求区间[L,R]的GCD的值,并求出有多少个子区间满足和[L,R]的GCD相等. ...

  6. 线程入门之start()和run()的区别

    package com.thread; /** * start()和run()的区别 * start():并行执行 * run():方法调用,顺序执行 * @author 95Yang */ publ ...

  7. 常用ADB命令

    adb devices          查看当前已与pc端连接的设备序列号 adb install -r   +apk名称     安装应用程序(带-r参数表示强制安装,可以覆盖安装) adb un ...

  8. Codeforces Round #377 (Div. 2) C. Sanatorium 水题

    C. Sanatorium time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  9. ZOJ-2365 Strong Defence 无公共边割边集

    题意:该题的题意晦涩,勉勉强强听别人说了一遍后再读了一遍题才算懂了题意,题图说的是A国因为B国药进攻自己的国家,于是想办法在联通A-B之间的路径上进行阻击.阻击的舰船停留在一个路径上,舰船上都要放置水 ...

  10. nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器

    参照网址: [1]http://blog.csdn.net/redstarofsleep/article/details/45092147 [2]HLS介绍:http://www.cnblogs.co ...