Java视频格式转化的实现方法

 更新时间:2018年02月28日 15:14:33   作者:liuyazhuang  
这篇文章主要为大家详细介绍了Java视频格式转化的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Java视频格式转化的具体代码,供大家参考,具体内容如下

核心是利用ffmpeg进行视频转换,我们自己并不写转换视频的代码,只是调用ffmpeg,它会帮我们完成视频的转换。ffmpeg支持的类型有:asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等,这些类型,可以利用ffmpeg进行直接转换。ffmpeg不支持的类型有:wmv9,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; 
    } 
  } 
} 

 类ChangeVideo主要进行视频格式的转化

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 ,主要设置可执行程序和动态链接库以及转化过程中生成的临时视频文件的位置。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java使用DFA算法实现敏感词过滤的示例代码

    Java使用DFA算法实现敏感词过滤的示例代码

    很多项目中都会有一个敏感词管理模块,本文主要介绍了Java使用DFA算法实现敏感词过滤的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Java数据结构之栈的基本定义与实现方法示例

    Java数据结构之栈的基本定义与实现方法示例

    这篇文章主要介绍了Java数据结构之栈的基本定义与实现方法,简单描述了数据结构中栈的功能、原理,并结合java实例形式分析了栈的基本定义与使用方法,需要的朋友可以参考下
    2017-10-10
  • Java中实现在一个方法中调用另一个方法

    Java中实现在一个方法中调用另一个方法

    下面小编就为大家分享一篇Java中实现在一个方法中调用另一个方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • Java 基于tcp协议实现文件上传

    Java 基于tcp协议实现文件上传

    这篇文章主要介绍了Java 基于tcp协议实现文件上传,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-11-11
  • 解决SpringBoot application.yaml文件配置schema 无法执行sql问题

    解决SpringBoot application.yaml文件配置schema 无法执行sql问题

    这篇文章主要介绍了解决SpringBoot application.yaml文件配置schema 无法执行sql问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • jpa使用注解生成表时无外键问题及解决

    jpa使用注解生成表时无外键问题及解决

    这篇文章主要介绍了jpa使用注解生成表时无外键问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java数据开发辅助工具Docker与普通程序使用方法

    Java数据开发辅助工具Docker与普通程序使用方法

    这是为数据开发人员使用的辅助工具,用于数据库之间的表同步,说同步并不严谨,因为不是实时更新的,更确切的说法是复制,可以方便的从一个数据库复制表到另一个数据库,以下遇到同步的词请理解为复制
    2021-09-09
  • Jenkins+maven持续集成的实现

    Jenkins+maven持续集成的实现

    这篇文章主要介绍了Jenkins+maven持续集成的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Java设计模式之享元模式

    Java设计模式之享元模式

    这篇文章介绍了Java设计模式之享元模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • 使用jsoup解析html的table中的文本信息实例

    使用jsoup解析html的table中的文本信息实例

    今天小编就为大家分享一篇使用jsoup解析html的table中的文本信息实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05

最新评论