当前位置: 首页 > 编程日记 > 正文

java调用ffmpeg,mencoder进行视频转换,读取时长等

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

以前做的一个基于ffmpeg的视频格式转换的程序,现在抽空整理一下,很多地方都是从别的大神那借鉴的,只是把自己的觉得有用的,对别人有帮助的拿出来分享分享,下面是代码

package video;

import it.sauronsoftware.jave.AudioAttributes;
import it.sauronsoftware.jave.DefaultFFMPEGLocator;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.EncodingAttributes;
import it.sauronsoftware.jave.FFMPEGLocator;
import it.sauronsoftware.jave.InputFormatException;
import it.sauronsoftware.jave.VideoAttributes;
import it.sauronsoftware.jave.VideoSize;

import java.io.File;
import java.util.List;

public class ConvertVideo {
 
 private static File inFolder;//需要转换的文件夹
 
 private static File outFolder;//保存avi文件的文件夹地址
 
 private static File inFile;//每个文件的file对象
 
 private static String name;//文件名称,用在保存avi文件,name.avi,不带扩展名的
 
 private static String Name;//文件名称,(带扩展名的)
 
 public ConvertVideo(File inFolder,File outFolder){//构造函数,进行测试时传入两个文件夹地址
  this.inFolder=inFolder;
  this.outFolder=outFolder;
 }
 
 public static void Test(){
  String[] fileList=inFolder.list();
  for(int i=0;i<fileList.length;i++){
   inFile=new File(inFolder.getAbsolutePath()+"\\"+fileList[i]);
   Name=inFile.getName();
   name=getFileNameNoEx(Name);//获得没有扩展名的文件名
   System.out.println(name);
   File txtFile=new File(inFolder.getAbsolutePath()+"\\"+name+".txt");//视频上传完毕会生成一个同名的txt文件
   if(txtFile.exists()){//判断是否上传完毕
    convert();
   }
  }
 }
 /**
  * 截取不带扩展名的文件名
  * @param : String
  * @return : String
  *
  */
 public static String getFileNameNoEx(String filename) {
     if ((filename != null) && (filename.length() > 0)) {
         int dot = filename.lastIndexOf('.');
         if ((dot >-1) && (dot < (filename.length()))) {
             return filename.substring(0, dot);
         }
     }
     return filename;
 }
 /**
  * 视频转换调用函数 
  *@return : void
  *
  */
 public static void convert() {
        if(!checkfile(inFile)){
         System.out.println(inFile+" is not file");
         return;
        }    
        if (process()) {    
         System.out.println("ok");
        }
 }
/**
 *视频转换函数
 * @return : boolean
 *
 *
 */
 private static boolean process() { 
 
   int type = checkContentType();
        boolean status = false;
        System.out.println("name="+name+"  "+"Name="+Name+"  "+"type="+type);
        if (type==0) {
          status = processFLV(inFile);// 直接将文件转为avi文件          
        } else if (type==1) {
            processAVI(inFile);
            status=true;
        }else if(type==2){
         System.out.println("你的文件已经是avi格式,无须转换!");
        }
        return status;
    }
 /**
  *检查视频类型
  * @param : void
  * @return : int
  *
  */
    private static int checkContentType() {
     String path=inFile.getName();//path是绝对路径
        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 2;
        } 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;
        } else if(type.equals("mpeg")){
         return 0;
        }else if(type.equals("mkv")){
         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;
    }
   /**
    * 检查文件是不是File对象
    * @param : File
    * @return : boolean
    *
    */
    private static boolean checkfile(File path){
    
     if(!path.isFile()){
      return false;
     }
     return true;
    }
    /**
     *对于ffmpeg无法解析的wmv9,rm,rmvb视频类型,利用mencoder进行解析,menconder视频转换
     * @param : File
     * @return : String
     *
     *
     */ 
    private static String processAVI(File inFile) {
     String inpath=inFile.getAbsolutePath();//PATH为file对象,先获得绝对路径,赋值给path
     String outpath =outFolder.getAbsolutePath()+"\\"+name+".avi";//为输出的绝对路径
     File Test=new File(outpath);
     if(Test.exists()){
      System.out.println("视频已经转换,无须再次转换!");
      return null;
     }else{
       List<String> commend=new java.util.ArrayList<String>();
             commend.add("e:\\mencoder");
             commend.add(inpath);
             commend.add("-o");
             commend.add(outpath);
             commend.add("-oac");
             commend.add("mp3lame");
             commend.add("-lameopts");
             commend.add("cbr:br=32");
             commend.add("-ovc");
             commend.add("xvid");
             commend.add("-xvidencopts");
             commend.add("bitrate=1024");
             commend.add("-vf");
             commend.add("scale=720:-3");
             //commend.add("-o");
         
             StringBuffer sb=new StringBuffer();
             for(int i=0;i<commend.size();i++){
              sb.append(commend.get(i)+" ");
             }
             try{
              ProcessBuilder builder = new ProcessBuilder();
                 builder.command(commend);
                 builder.start();
                 return "ok";
             }catch(Exception e){
              e.printStackTrace();
              return null;
             }
           
     }
      
    }
/**
 *
 * 对于ffmpeg可以解析的格式(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) ,用ffmpeg进行解析,ffmpeg视频转换
 * @param : File
 * @return : loolean
 *
 */
    private static boolean processFLV(File oldfilepath) {
     FFMPEGLocator locator = new FFMPEGLocator() {
   
   @Override
   protected String getFFMPEGExecutablePath() {
    // TODO Auto-generated method stub
    return "c://ffmpeg//ffmpeg.exe";
   }
  };
  File source = oldfilepath;
  String out=outFolder.getAbsolutePath()+"\\"+name+".avi";//输出的绝对路径
  File target=new File(out);
  //GetVideoInfo getVideoInfo = new GetVideoInfo();
  //String decoder=getVideoInfo.getDecoder(source);
  if(target.exists()/*||decoder.equals("h264")*/){
   System.out.println("视频无需进行转换!");
   return false;
  }else{
   AudioAttributes audio = new AudioAttributes();//设置音频属性
   audio.setCodec("libmp3lame");//音频使用libmp3lame编码
   audio.setBitRate(new Integer(128000));//设置比特率
   audio.setChannels(new Integer(1));//设置通道,缺省为1
   audio.setSamplingRate(new Integer(22050));//
   VideoAttributes video = new VideoAttributes();//设置视频属性
   
   video.setCodec("mpeg4");//设置编码格式
   video.setBitRate(new Integer(1024000));//设置比特率
   video.setFrameRate(new Integer(10));//设置
   /*getVideoSize getvideoSize=new getVideoSize();
   VideoInfo videoInfo=new VideoInfo();
   videoInfo=getvideoSize.getVideoInfo(source);
   VideoSize videoSize=videoInfo.getSize();
   if(videoSize.getHeight()!=1280||videoSize.getWidth()!=400){
    ResourceBundle resource=ResourceBundle.getBundle("parameter",Locale.getDefault());
    String a=resource.getString("height");
    String b=resource.getString("width");
    int height=Integer.valueOf(a);
    int width=Integer.valueOf(b);
    video.setSize(new VideoSize(width,height));//设置大小
   }*/
   //setSize set=new setSize();
   //set.set(video,source);
   video.setSize(new VideoSize(1080,720));
   EncodingAttributes attrs = new EncodingAttributes();
   attrs.setFormat("avi");
   attrs.setAudioAttributes(audio);
   attrs.setVideoAttributes(video);
   Encoder encoder = new Encoder(locator);
   try {
    encoder.encode(source, target, attrs);
    return true;
   } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    return false;
   } catch (InputFormatException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    return false;
   } catch (EncoderException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    return false;
   }
   
  }
  
    }
 
 
}

这是一个简单的视频处理的方法,轻喷

转载于:https://my.oschina.net/u/1034481/blog/221066

相关文章:

数字人民币实现可控匿名交易?产业升级离不开安全可信的“数字底座”

自央行进行数字人民币试点测试工作以来&#xff0c;人们讨论最多的可能是它的便捷性、匿名性。不过&#xff0c;它的意义远不止于人类个体层面。 作为一种面向未来的货币形式&#xff0c;在未来数字经济时代&#xff0c;央行数字人民币的普及无疑将加速全球资产数字化和身份数…

apache+tomcat 搭建负载均衡系统

apachetomcatmod_jk 搭建负载均衡系统。0.os系统采用centos6.8 x64 2.6.32-642.el6.x86_641.首先安装好jdk环境本次采用jdk-8u111-linux-x64.gz jdk和jre的安装目录要不同&#xff0c;否则的话lib目录下没有dt.jar 和tools.jar 要配置好环境变量如下 vi /etc/profile #ad…

从普本到北大:我的跨校跨专业考研经验

首先做一个我考研情况的简介。 经历了2013年考研的混战&#xff0c;据说是史上考研人数顶峰的年份&#xff0c;因为2014改革&#xff0c;不再有自费生之后&#xff0c;人民群众对于所谓学术硕士的需求量激减&#xff0c;继 而投奔价格费用相当&#xff0c;读书年份较少的专业硕…

C#中使用DirectX编程

我感觉声音的播放比较简单。我们从播放声音开始。为什么我这么觉得&#xff1f;我也不知道。这里是展示最最最最最简单的DirectX播放声音的例子&#xff0c;我尽量省略了无关的代码。最后的代码只有19行&#xff0c;够简单了吧&#xff1f; 准备工作&#xff1a;1.安装了Direc…

40+场面试,100%通过率,我想分享的14条经验

来源 | 陈同学在搬砖头图 | 下载于视觉中国大家好&#xff0c;我是陈同学&#xff0c;首先来一个简单的自我介绍和个人的经历分享。我的本科和硕士均就读于哈工大&#xff0c;在研究生期1年时间内自学操作系统、计算机网络、C、数据结构等&#xff0c;累计学习30本书、500博客文…

云端卫士架构师讲DDoS攻击的智能防御之道

DDoS即分布式拒绝服务攻击&#xff0c;这是一场关乎资源的较量&#xff0c;攻击者通过自己控制的大量僵尸主机&#xff0c;向目标设施&#xff08;服务器、运营商网络和基础架构等&#xff09;发起洪水猛兽般的流量型攻击&#xff0c;或是连绵不绝的应用型攻击。 如果将受害者比…

C#中方法参数的四种类型

C&#xff03;中方法的参数有四种类型&#xff1a;&#xff0d;值参数&#xff1a;不含任何修饰符。方法中的形参是实参的一份拷贝&#xff0c;形参的改变不会影响到内存中实参的的值&#xff0c;实参是安全的。&#xff0d;引用参数&#xff1a;以ref修饰符声明。传递的参数实…

赠书 | 算力时代,用 Python 来快速解决复杂问题

Python作为一种编程语言&#xff0c;拥有简洁、高效的表达能力。与此同时&#xff0c;Python语言环境中还配备各种软件库&#xff0c;即模块。结合实际问题&#xff0c;选择适当的模块&#xff0c;便可生成简单、快速、正确的程序。书中列举了一些数值计算的简单例题&#xff0…

用for实现Go的while和do...while

Go的while和do...while实现 Go语言没有while和do...while语法&#xff0c;我们可以通过for实现&#xff1a;即break在业务代码执行前相当与while&#xff0c;break在业务代码执行后相当do...while while for {if condition {break}xxxxxxxx } do...while for {xxxxxxxxif cond…

DTCC:数据库安全重点在数据拷贝过程中

本文讲的是DTCC&#xff1a;数据库安全重点在数据拷贝过程中&#xff0c;2017年5月11日-13日&#xff0c;2017中国数据库技术大会于北京国际会议中心盛大开幕。作为国内最受关注的数据库技术大会&#xff0c;本届大会以“数据驱动价值发现”为主题&#xff0c;汇集多个领域的百…

Log4J配置方式Java工程测试

2019独角兽企业重金招聘Python工程师标准>>> Log4J配置方式 1、 导入jar包 Commons-logging .jarLog4j-1.2.17.jar2、 编写log4j.properties 文件 ############## ############################## 优先级 INFO ,输出到console_log 和filelog 两个位置 log4j.root…

C#“装箱”(boxing)与“拆箱”(unboxing)

装箱和拆箱&#xff1a;任何值类型、引用类型可以和object&#xff08;对象&#xff09;类型之间进行转换。装箱转换是指将一个值类型隐式或显式地转换成一个object类型&#xff0c;或者把这个值类型转换成一个被该值类型应用的接口类型&#xff08;interface-type&#xff09;…

无人机、IoT 设备都有漏洞?专访以色列老牌安全企业Check Point | 拟合

从无序中寻找踪迹&#xff0c;从眼前事探索未来。2021 年正值黄金十年新开端&#xff0c;CSDN 以中立技术社区专业、客观的角度&#xff0c;深度探讨中国前沿 IT 技术演进&#xff0c;推出年度重磅企划栏目——「拟合」&#xff0c;通过对话企业技术高管大咖&#xff0c;跟踪报…

sql server 在占用服务器内存居高不下怎么办【转】

在管理一个测试服务器的时候&#xff0c;内存使用率居高不下&#xff0c;在资源管理器中查看到 sql server 2008 占用了80%的系统资源&#xff0c;于是找到了一下资料&#xff0c;并解决了Sql Server 2008 占用内存过大的问题。 转自百度经验http://jingyan.baidu.com/article…

C# checked、unchecked操作符

checked和unchecked操作符用于整型算术运算时控制当前环境中的溢出检查。下列运算参与了checked和unchecked检查&#xff08;操作数均为整数&#xff09;&#xff1a;1&#xff09; 预定义的&#xff0b;&#xff0b;和――一元运算符。2&#xff09; 预定义的&#xff0d;一…

TPAMI 2021 | 深度赋智AutoDL系列竞赛世界冠军方案首次公开

导读&#xff1a;「深度赋智」斩获NeurIPS-AutoDL 2019系列竞赛总决赛世界冠军&#xff0c;在图像/音频/视频/文本/表格不同场景的十个数据集上稳定获得八项第一和均分第一。为共同推动AutoDL技术的快速发展&#xff0c;冠军方案的技术细节首次公开&#xff0c;最新相关论文已被…

转: 如何实现jQuery的Ajax文件上传

【PHP文件上传】 在开始之前&#xff0c;我觉得是有必要把通WEB上传文件的原理简单说一下的。实际上&#xff0c;在这里不管是PHP&#xff0c;JSP&#xff0c;还是ASP处理上传的文件&#xff0c;其实都是WEB早已把文件上传到服务器了&#xff0c;我们只是运用上传处理函数来处理…

Mybatis遍历查询 ——foreach

第一步&#xff1a; 在xxxMapper接口中添加一个函数&#xff0c;返回一个list&#xff0c;这里的参数是一个integer类型的集合 public List<Emp> findEmpByList(Param("list") List<Integer> list); 第二步&#xff1a; 在xxxMapper.xml 中添加statement…

C#中如何获取注册表信息

实现方式&#xff1a;利用Microsoft.win32类提供的注册表类访问系统注册表获取ODBC数据服务列表。 具体实现&#xff1a; Microsoft.win32提供了RegistryKey类&#xff0c;用来访问系统的注册表。 ///定义注册表子Path string strRegPath "SOFTWARE/ODBC/ODBC.INI…

用 Python 实现隐身,我可以 | 文末福利

作者 | 李秋键头图 | 下载于视觉中国出品 | AI 科技大本营&#xff08;ID:rgznai100&#xff09;引言&#xff1a;视频和图像的隐身术是指在视频或者图像中中&#xff0c;在没有任何输入遮罩的情况下&#xff0c;通过框选目标体&#xff0c;使得程序实现自动去除视频中的文本叠…

改变myeclipse北京颜色

经常用 MyEclipse 写代码&#xff0c;时间久了会觉得白色的背景颜色很刺眼&#xff0c;于是乎便想要换一种柔和些的颜色来缓解视力疲劳&#xff0c;那么怎么样来修改 MyEclipse 代码编辑区域的背景颜色呢&#xff1f; 依次展开菜单 Window >> Preferences >> Gener…

redis 代理工具Predixy安装部署

PredixyPredixy 是一款高性能全特征redis代理&#xff0c;支持redis-sentinel和redis-cluster特性高性能并轻量级支持多线程多平台支持&#xff1a;Linux、OSX、BSD、Windows(Cygwin)支持Redis Sentinel&#xff0c;可配置一组或者多组redis支持Redis Cluster支持redis阻塞型命…

超级详细的 Python 数据分析指南

来源 | 算法进阶头图 | 下载于视觉中国前言&#xff1a;数据分析是通过明确分析目的&#xff0c;梳理并确定分析逻辑&#xff0c;针对性的收集、整理数据&#xff0c;并采用统计、挖掘技术分析&#xff0c;提取有用信息和展示结论的过程&#xff0c;是数据科学领域的核心技能。…

C#实现-移位加密

/* Filename: encrypt_string.cs Author : zhanghua Date : 2005-08-11 Fuction : input a strig and encrypt a string 加密后的字符串的第一个字符是原先字符串的最后一个字符&#xff0c; 其余的每一个字符是对应的原字符串中的前一个字符的值…

oracle相关操作

查看用户系统权限&#xff1a;select * from dba_sys_privs;select * from session_privs;select * from user_sys_privs;查看用户对象权限&#xff1a;select * from dba_tab_privs;select * from all_tab_privs;select * from user_tab_privs;修改数据库密码&#xff1a;alte…

Ansible批量安装mysql数据

1.构建安装目录mkdir -p /ansible/roles/mysql/{defaults,files,handlers,meta,tasks,templates,vars}defaults 默认寻找路径tasks 存放playbooks路径files 存放文件和脚本&#xff0c;copy模块文件搜索路径templates 模版存放路径handlers notify调用部分playbook存放路径vars…

C#在客户端和服务端操作Excel文件

一、在客户端把数据导入到Excel文件步骤1、创建Excel application对象&#xff0c;打开或生成Excel文件//服务端创建StringBuilder对象System.Text.StringBuilder sbnew System .Text .StringBuilder (); //指定客户端执行语言sb.Append ("<Script LanguageVBScript&g…

oracle数据库同步交换的方法

oracle数据同步方案与实现&#xff1a;如何在两个oracle服务器之间交换数据&#xff1f;来源:无忧模板 作者:网络编辑 更新时间:2010-08-09 18:10 点击:次 方案一&#xff1a;建立两个数据库之间的DATA_LINK&#xff0c;直接将新数据写入另一数据库方案二&#xff1a;使用SQL *…

让语音助手听懂方言,这个数据集能搞定

来源 | HyperAI超神经头图 | 来源于网络 侵删方言是语音识别技术发展中必须要迈过去的坎儿&#xff0c;那么如何让模型能够听懂和理解方言呢&#xff1f;使用优质的数据集是一种的方法&#xff0c;本文将介绍一个经典的方言录音数据集 TIMIT。随着科技的成熟&#xff0c;语音识…

Django内置Admin

Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件&#xff0c;使用方式有&#xff1a;依赖APP&#xff1a;django.contrib.authdjango.contrib.contenttypesdjango.contrib.messagesdjango.contrib.sessions模板的context_processors&#xff1a;django.cont…