利用ffmpeg实现视频格式转换成flv,保证能成功运行

/**
 * 视频转换(转换为flv格式)
 * 
 * 创建时间:2010-11-21
 */
public class TestConvert {

 /** 输入文件路径属性 */
 private String IN_PATH;

 /** 输出文件路径属性 */
 private String OUT_PATH;

 /** ffmpeg.exe存放路径属性 */
 private String FFMPEG_PATH;

 /** 完成进度属性 */
 private int COMPLETE = 0;

 

 /** 构造方法 */
 public TestConvert(String inpath, String outpath, String ffmpegpath) {
  this.IN_PATH = inpath;// 赋值待转换的视频文件路径
  this.OUT_PATH = outpath;// 赋值转换生成的flv格式的文件路径
  this.FFMPEG_PATH = ffmpegpath;// 赋值实际转换外部程序ffmpeg所在的目录
 }

 

/** 主方法(测试) */

 public static void main(String[] args) {
  TestConvert convert=new TestConvert("e://input//a.MP4", "e://output//w.flv", "e://");
  convert.execute(convert.toFlv());// 执行转换到flv并且加水印的方法
  //convert.execute(convert.getImage());
 }
 
 /** 进行转换处理方法 */
 public void execute(List<String> list) {
  ProcessBuilder builder = new ProcessBuilder();// 进程生成器对象
  builder.command(list);// 以动态数组对象参数创建命令
  try {
   Process pc = builder.start();// 线程启动执行
   // 调用readInputStream方法得到对进程的输出流监测返回的信息
   String errorMsg = readInputStream(pc.getErrorStream(), "error");
   String outputMsg = readInputStream(pc.getInputStream(), "out");
   int c = pc.waitFor();
   if (c != 0) {// 如果处理进程在等待
    System.out.println("处理失败:" + errorMsg);
   } else {
    System.out.println(this.COMPLETE + outputMsg);
   }
  } catch (Exception e) {
   System.out.println("在进行转换处理方法中发生异常");
  }
 }

 

 /** 建立转换到flv的命令 */
 public List<String> toFlv() {  
  List<String> commend = new ArrayList<String>();// 用来进行视频转换为flv参数设置
  // 设置ffmpeg.exe所在路径
  commend.add(this.FFMPEG_PATH + "ffmpeg.exe");
  commend.add("-i");// 设置要输入的文件


  commend.add(this.IN_PATH);// 要输入的文件的位置
  commend.add("-y");// 覆盖掉输出目录中的同名文件
  
  commend.add("-acodec");// 设置音频的编码方式
  commend.add("libmp3lame");// 编码方式为mp3,可以指定为libmp3lame或aac

 

  commend.add("-ar");// 设置声音的采样频率
  commend.add("22050");// 对于音频的采样率可以指定为22050、24000、44100或48000

 

  commend.add("-qscale");// 设置动态码率
  commend.add("6");// 测试发现如果想得到高品质视频此值越小越好


  commend.add(this.OUT_PATH);// 设置输出flv文件路径
  return commend;
 }

 

 /** 建立视频截图的命令 */
 public List<String> getImage() {
  List<String> commend = new ArrayList<String>();// 用来进行视频截图参数设置
  commend.add(this.FFMPEG_PATH + "ffmpeg");// 设置转换器所在位置


  commend.add("-i");// 设置要输入的文件

  commend.add(this.OUT_PATH);// 要输入的文件的位置


  commend.add("-y");// 覆盖掉输出目录中的同名文件

  commend.add("-f");// 输出文件格式

  commend.add("image2");// 对应jpg格式

  commend.add("-ss");// 可以从指定时间点开始转换任务


  commend.add("8");// 从视频的第8秒开始

  commend.add("-t");// 设置记录时间


  commend.add("1");// 记录时间为1秒

  commend.add("-s");// 输出的图片分辨率


  commend.add("200x200");// 图片大小
  commend.add(this.OUT_PATH.substring(0, this.OUT_PATH.lastIndexOf("."))
    + ".jpg");// 设置输出文件目录
  return commend;
 }

 

 /** 对进程的输出流进行监测 返回的是完成进度百分比 */
 private 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("."));// 截取当前所用时间字符串
    float t = (float) Long.parseLong(time) / (float) totalTime;// 计算所用时间与总共需要时间的比例
    this.COMPLETE = (int) Math.ceil(t * 100);// 计算完成进度百分比
   }
   System.out.println("完成:" + this.COMPLETE + "%");
  }
  br.close();// 关闭进程的输出流
  return lines.toString();
 }

 

}



转帖:http://blog.csdn.net/zdyfzj/article/details/6050541
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值