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

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

(0)

相关推荐

  • json-lib将json格式的字符串,转化为java对象的实例

    json格式字符串中的日期是按照'yyyy-MM-dd HH:mm:ss'格式,如果按照常规的转换为对象,该日期则解析成当前系统时间 JSONObject json = JSONObject.fromObject(data); Dispatchplan dp = (Dispatchplan)JSONObject.toBean(json, Dispatchplan.class); 导致原因JSONObject可能无法识别日期格式,做了以下修改就解决 Dispatchplan dp = new Di

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

    本文实例为大家分享了Java视频格式转化的具体代码,供大家参考,具体内容如下 核心是利用ffmpeg进行视频转换,我们自己并不写转换视频的代码,只是调用ffmpeg,它会帮我们完成视频的转换.ffmpeg支持的类型有:asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等,这些类型,可以利用ffmpeg进行直接转换.ffmpeg不支持的类型有:wmv9,rm,rmvb等,这些类型需要先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式. 废话不大多说了,首先

  • 使用开源项目JAVAE2 进行视频格式转换

    使用开源项目JAVAE 进行视频格式转换 JAVAE简介: JAVE (Java音频视频编码器)库是ffmpeg项目的Java包装器.开发人员可以利用JAVE2将音频和视频文件从一种格式转换为另一种格式.在示例可以转换成一个AVI文件MG,您可以更改一个DivX视频(youtube) Flash FLV,您可以转换WAV音频文件到MP3和Ogg Vorbis,您可以分离和转换音频和视频跟踪代码,您可以调整视频,改变他们的大小和比例等.JAVE2还支持许多其他格式.容器和操作. 官网地址:http

  • js接收并转化Java中的数组对象的方法

    在做项目时,要向ocx控件下发命令,就要在js中得到java中的对象,然后拼成一种格式,下发下去...当对象是一个时比较简单,但如果对象是一个数组时,就略显麻烦了. 开始我以为有简单的方式,可以直接进行内容的转化,后来发现不可以,网上说js与java没有桥接的东西,所以呢: 我的解决方案是:在action层,将java的对象数组转化为Json串,而在js中,再把json转化为数组对象. 1.将java的对象数组转化为Json串: 要用到两个类: net.sf.json.JSONObject ne

  • java 将jsonarray 转化为对应键值的jsonobject方法

    有时候我们再操作数据的时候,很多数据是jsonarry 格式的 如: [{"name":"测试数据","id":1},{"name":"测试数据2","id":2}] 这样的格式很类型表格数据类型.但是我们要取id 为1的name 这样我们就要先变量以便了.如果需要多次操作这样的类型,显得很麻烦. 这里的数据我们可以看出id 是唯一的.那么我们可以想办法将其转为jsonobject 这样

  • java使用正则表达式判断邮箱格式是否正确的方法

    本文实例讲述了java使用正则表达式判断邮箱格式是否正确的方法.分享给大家供大家参考.具体如下: import java.io.*; public class CheckEmail { public static boolean checkEmail(String email) {// 验证邮箱的正则表达式 String format = "\\p{Alpha}\\w{2,15}[@][a-z0-9]{3,}[.]\\p{Lower}{2,}"; //p{Alpha}:内容是必选的,和

  • Java正则判断日期格式是否正确的方法示例

    本文实例讲述了Java正则判断日期格式是否正确的方法.分享给大家供大家参考,具体如下: 1.Java中用正则表达式判断日期格式是否正确 DateType.java: /** * @Title:DateType.java * @Package:com.you.dao * @Description: * @Author: 游海东 * @Version V1.2.3 */ package com.you.dao; import java.util.regex.Matcher; import java.

  • 详解java调用ffmpeg转换视频格式为flv

    详解java调用ffmpeg转换视频格式为flv 注意:下面的程序是在Linux下运行的,如果在windows下rmvb转换成avi会出现问题,想成功需要下载下个drv43260.dll东西放到C:WindowsSystem32下面 这几天在写一个视频管理系统,遇到一个很大的问题就是如果把不同格式转换为flv,格式!经过网上的一番搜索,自己在总结,整理,整理,终于整出来了!实现了视频进行转换的同时还能够进行视频截图和删除原文件的功能! 格式转换主要原理就是先用java调用ffmpeg的exe文件

  • Java使用utf8格式保存文本文件的方法

    本文实例讲述了Java使用utf8格式保存文本文件的方法.分享给大家供大家参考,具体如下: FileOutputStream fos = null; OutputStreamWriter writer = null; try { File file = new File(filepath); fos = new FileOutputStream(file); writer = new OutputStreamWriter(fos,"utf-8"); writer.write(makeL

  • Python实现将doc转化pdf格式文档的方法

    本文实例讲述了Python实现将doc转化pdf格式文档的方法.分享给大家供大家参考,具体如下: #-*- coding:utf-8 -*- # doc2pdf.py: python script to convert doc to pdf with bookmarks! # Requires Office 2007 SP2 # Requires python for win32 extension import sys, os from win32com.client import Dispa

  • python-opencv 将连续图片写成视频格式的方法

    如下所示: import cv2 import os #图片路径 im_dir = '/home/suanfa/data/out/201708231503440' #输出视频路径 video_dir = '/home/suanfa/data/out/201708231503440-1018.avi' #帧率 fps = 30 #图片数 num = 426 #图片尺寸 img_size = (841,1023) #fourcc = cv2.cv.CV_FOURCC('M','J','P','G')

随机推荐