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