java调用ffmpeg实现视频转换的方法

时间:2022-08-28 18:58:12

本文实例讲述了java调用ffmpeg实现视频转换的方法。分享给大家供大家参考。具体分析如下:

这里环境我是在windows平台下测试的。。。

需要在e:\下有ffmpeg.exe;mencoder.exe;drv43260.dll;pncrt.dll共4个文件。
 
还要在e:\input下放各种文件名为a的以下各种视频文件;还要e:\output;java程序执行后能得到一个a.flv的已转换的文件。

ffmpeg.exe能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)

对ffmpeg.exe无法解析的文件格式(wmv9,rm,rmvb等),可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式;

mencoder.exe;drv43260.dll;pncrt.dll这3个文件是为文件格式(wmv9,rm,rmvb等)转换为avi(ffmpeg能解析的)格式准备的;

再把转换好的avi文件再用ffmpeg.exe转换成flv格式的视频文件。。。
 
java文件的内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import java.io.File;
import java.util.List;
public class ConvertVideo {
 private final static String PATH = "c:\\test\\a.mpg";
 public static void main(String[] args) {
    if(!checkfile(PATH)){
     System.out.println(PATH+" is not file");
     return;
    }   
 if (process()) {        
      System.out.println("ok");
    }
 }
 private static boolean process() {   
 int type = checkContentType();
    boolean status = false;
    if (type==0) {
      status = processFLV(PATH);// 直接将文件转为flv文件
    } else if (type==1) {
      String avifilepath = processAVI(type);
      if (avifilepath == null)
        return false;// avi文件没有得到
      status = processFLV(avifilepath);// 将avi转为flv
    }
    return status;
  }
  private static int checkContentType() {
    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 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;
  }
  private static boolean checkfile(String path){
   File file=new File(path);
   if(!file.isFile()){
   return false;
   }
   return true;
  }
 //对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
  private static String processAVI(int type) {
    List<String> commend=new java.util.ArrayList<String>();
    commend.add("e:\\mencoder");
    commend.add(PATH);
    commend.add("-oac");
    commend.add("lavc");
    commend.add("-lavcopts");
    commend.add("acodec=mp3:abitrate=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("c:\\home\\a.avi");
    try{
     ProcessBuilder builder = new ProcessBuilder();
      builder.command(commend);
      builder.start();
      return "c:\\home\\a.avi";
    }catch(Exception e){
     e.printStackTrace();
     return null;
    }
  }
 //ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
  private static boolean processFLV(String oldfilepath) {
   if(!checkfile(PATH)){
     System.out.println(oldfilepath+" is not file");
     return false;
     }  
    List<String> commend=new java.util.ArrayList<String>();
    commend.add("e:\\ffmpeg");
    commend.add("-i");
    commend.add(oldfilepath);
    commend.add("-ab");
    commend.add("64");
    commend.add("-acodec");
    commend.add("mp3");
    commend.add("-ac");
    commend.add("2");
    commend.add("-ar");
    commend.add("22050");
    commend.add("-b");
    commend.add("230");
    commend.add("-r");
    commend.add("24");
    commend.add("-y");
    commend.add("c:\\home\\a.flv");
    try {
      ProcessBuilder builder = new ProcessBuilder();
      builder.command(commend);
      builder.start();
      return true;
    } catch (Exception e) {
      e.printStackTrace();
      return false;
    }
  }
}

希望本文所述对大家的java程序设计有所帮助。