热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

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

这篇文章主要为大家详细介绍了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 commend = new ArrayList(); 
     
    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 = new ArrayList(); 
    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 

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

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


推荐阅读
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • 本文介绍了在Java开发中创建子包(package)的正确步骤,并解析了可能出现的错误情况。其中包括第一种错误情况的解决方法,以及在空包下只建一个包时可能出现的问题及解决方法。通过多建几个包,可以让IDE自动将父包提取出来,形成正确的层次结构。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 使用J2SE模拟MVC模式开发桌面应用程序的工程包的介绍
    以我开发过的一个娱乐管理系统为例:下图为我系统的业务逻辑的MVC流程:下图为以Eclipse开发中各包的说明:转载于:https:blog ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 模块化区块链生态系统的优势概述及其应用案例
    本文介绍了相较于单体区块链,模块化区块链生态系统的优势,并以Celestia、Dymension和Fuel等模块化区块链项目为例,探讨了它们解决可扩展性和部署问题的方案。模块化区块链架构提高了区块链的可扩展性和吞吐量,并提供了跨链互操作性和主权可扩展性。开发人员可以根据需要选择执行环境,并获得奖学金支持。该文对模块化区块链的应用案例进行了介绍,展示了其在区块链领域的潜力和前景。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • 项目运行环境配置及可行性分析
    本文介绍了项目运行环境配置的要求,包括Jdk1.8、Tomcat7.0、Mysql、HBuilderX等工具的使用。同时对项目的技术可行性、操作可行性、经济可行性、时间可行性和法律可行性进行了分析。通过对数据库的设计和功能模块的设计,确保系统的完整性和安全性。在系统登录、系统功能模块、管理员功能模块等方面进行了详细的介绍和展示。最后提供了JAVA毕设帮助、指导、源码分享和调试部署的服务。 ... [详细]
  • 本文介绍了常用的编辑器快捷键,包括快速转换编辑器、浏览选项卡、提取本地变量和方法、编辑器窗口最大化等功能。通过使用这些快捷键,可以提高编辑器的使用效率,减少复杂度,并提升代码的可测试性。 ... [详细]
  • Struts2+Sring+Hibernate简单配置
    2019独角兽企业重金招聘Python工程师标准Struts2SpringHibernate搭建全解!Struts2SpringHibernate是J2EE的最 ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
  • 【具体报错信息】ErrorparsingD:\android-sdks\system-images\android-22\android-wear\armeabi-v7a\devi ... [详细]
author-avatar
小邵Bans_530
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有