本文实例讲述了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程序设计有所帮助。