- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java使用ffmpeg和mencoder实现视频转码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文为大家分享了java使用ffmpeg和mencoder实现视频转码的具体代码,供大家参考,具体内容如下 。
准备:
需要下载ffmpeg和mencoder,百度一搜就有了,请自行下载.
不墨迹,上代码:
1)首先需要定义几个量:contants.java 。
1
2
3
4
5
6
7
8
9
10
|
public
class
contants {
public
static
final
string ffmpegpath =
"d:\\devtools\\ffmpeg\\bin\\ffmpeg.exe"
;
//ffmpeg的安装位置
public
static
final
string mencoderpath =
"d:\\devtools\\mencoder\\"
;
// mencoder的目录
public
static
final
string videofolder =
"d:\\tools\\video\\"
;
// 需要被转换格式的视频目录
public
static
final
string targetfolder =
"d:\\tools\\target\\"
;
// 转换后视频的目录
public
static
final
string videorealpath =
"d:\\tools\\target\\"
;
// 需要被截图的视频目录;
public
static
final
string imagerealpath =
"d:\\tools\\imgs\\"
;
// 截图的存放目录
}
|
2)其次,就是utils类了,具体里面有注释:convervideoutils.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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
|
import
java.io.file;
import
java.io.ioexception;
import
java.io.inputstream;
import
java.util.date;
import
java.util.list;
import
com.wdy.common.contants;
public
class
convervideoutils {
private
date dt;
private
long
begintime;
private
string sourcevideopath;
//源视频路径
private
string filerealname;
// 文件名 不包括扩展名
private
string filename;
// 包括扩展名
private
string videofolder = contants.videofolder;
// 别的格式视频的目录
private
string targetfolder = contants.targetfolder;
// flv视频的目录
private
string ffmpegpath = contants.ffmpegpath;
// ffmpeg.exe的目录
private
string mencoderpath = contants.mencoderpath;
// mencoder的目录
private
string imagerealpath = contants.imagerealpath;
// 截图的存放目录
public
convervideoutils() {
}
public
convervideoutils(string path) {
sourcevideopath = path;
}
public
string getpath() {
return
sourcevideopath;
}
public
void
setpath(string path) {
sourcevideopath = path;
}
/**
* 转换视频格式
* @param string targetextension 目标视频扩展名 .xxx
* @param isdelsoursefile 转换完成后是否删除源文件
* @return
*/
public
boolean
beginconver(string targetextension,
boolean
isdelsoursefile) {
file fi =
new
file(sourcevideopath);
filename = fi.getname();
filerealname = filename.substring(
0
, filename.lastindexof(
"."
)).tolowercase();
system.out.println(
"----接收到文件("
+ sourcevideopath +
")需要转换-------------------------- "
);
if
(!checkfile(sourcevideopath)) {
system.out.println(sourcevideopath +
"文件不存在"
+
" "
);
return
false
;
}
dt =
new
date();
begintime = dt.gettime();
system.out.println(
"----开始转文件("
+ sourcevideopath +
")-------------------------- "
);
if
(process(targetextension,isdelsoursefile)) {
date dt2 =
new
date();
system.out.println(
"转换成功 "
);
long
endtime = dt2.gettime();
long
timecha = (endtime - begintime);
string totaltime = sumtime(timecha);
system.out.println(
"转换视频格式共用了:"
+ totaltime +
" "
);
if
(processimg(sourcevideopath)) {
system.out.println(
"截图成功了! "
);
}
else
{
system.out.println(
"截图失败了! "
);
}
if
(isdelsoursefile) {
deletefile(sourcevideopath);
}
sourcevideopath =
null
;
return
true
;
}
else
{
sourcevideopath =
null
;
return
false
;
}
}
/**
* 对视频进行截图
* @param sourcevideopath 需要被截图的视频路径(包含文件名和扩展名)
* @return
*/
public
boolean
processimg(string sourcevideopath) {
if
(!checkfile(sourcevideopath)) {
system.out.println(sourcevideopath +
" is not file"
);
return
false
;
}
file fi =
new
file(sourcevideopath);
filename = fi.getname();
filerealname = filename.substring(
0
, filename.lastindexof(
"."
)).tolowercase();
list<string> commend =
new
java.util.arraylist<string>();
//第一帧: 00:00:01
//time ffmpeg -ss 00:00:01 -i test1.flv -f image2 -y test1.jpg
commend.add(ffmpegpath);
// commend.add("-i");
// commend.add(videorealpath + filerealname + ".flv");
// commend.add("-y");
// commend.add("-f");
// commend.add("image2");
// commend.add("-ss");
// commend.add("38");
// commend.add("-t");
// commend.add("0.001");
// commend.add("-s");
// commend.add("320x240");
commend.add(
"-ss"
);
commend.add(
"00:00:01"
);
commend.add(
"-i"
);
commend.add(sourcevideopath);
commend.add(
"-f"
);
commend.add(
"image2"
);
commend.add(
"-y"
);
commend.add(imagerealpath + filerealname +
".jpg"
);
try
{
processbuilder builder =
new
processbuilder();
builder.command(commend);
builder.start();
return
true
;
}
catch
(exception e) {
e.printstacktrace();
return
false
;
}
}
/**
* 实际转换视频格式的方法
* @param targetextension 目标视频扩展名
* @param isdelsoursefile 转换完成后是否删除源文件
* @return
*/
private
boolean
process(string targetextension,
boolean
isdelsoursefile) {
int
type = checkcontenttype();
boolean
status =
false
;
if
(type ==
0
) {
//如果type为0用ffmpeg直接转换
status = processvideoformat(sourcevideopath,targetextension, isdelsoursefile);
}
else
if
(type ==
1
) {
//如果type为1,将其他文件先转换为avi,然后在用ffmpeg转换为指定格式
string avifilepath = processavi(type);
if
(avifilepath ==
null
){
// avi文件没有得到
return
false
;
}
else
{
system.out.println(
"开始转换:"
);
status = processvideoformat(avifilepath,targetextension, isdelsoursefile);
}
}
return
status;
}
/**
* 检查文件类型
* @return
*/
private
int
checkcontenttype() {
string type = sourcevideopath.substring(sourcevideopath.lastindexof(
"."
) +
1
, sourcevideopath.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
;
}
/**
* 检查文件是否存在
* @param path
* @return
*/
private
boolean
checkfile(string path) {
file file =
new
file(path);
if
(!file.isfile()) {
return
false
;
}
else
{
return
true
;
}
}
/**
* 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
* @param type
* @return
*/
private
string processavi(
int
type) {
list<string> commend =
new
java.util.arraylist<string>();
commend.add(mencoderpath);
commend.add(sourcevideopath);
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(videofolder + filerealname +
".avi"
);
// 命令类型:mencoder 1.rmvb -oac mp3lame -lameopts preset=64 -ovc xvid
// -xvidencopts bitrate=600 -of avi -o rmvb.avi
try
{
processbuilder builder =
new
processbuilder();
builder.command(commend);
process p = builder.start();
dowaitfor(p);
return
videofolder + filerealname +
".avi"
;
}
catch
(exception e) {
e.printstacktrace();
return
null
;
}
}
/**
* 转换为指定格式
* ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
* @param oldfilepath
* @param targetextension 目标格式扩展名 .xxx
* @param isdelsoursefile 转换完成后是否删除源文件
* @return
*/
private
boolean
processvideoformat(string oldfilepath, string targetextension,
boolean
isdelsourcefile) {
if
(!checkfile(sourcevideopath)) {
system.out.println(oldfilepath +
" is not file"
);
return
false
;
}
//ffmpeg -i file_name.flv -ar 22050 new_file_name.mp4
list<string> commend =
new
java.util.arraylist<>();
commend.add(ffmpegpath);
commend.add(
"-i"
);
commend.add(oldfilepath);
commend.add(
"-ar"
);
commend.add(
"22050"
);
commend.add(targetfolder + filerealname + targetextension);
try
{
processbuilder builder =
new
processbuilder();
string cmd = commend.tostring();
builder.command(commend);
process p = builder.start();
dowaitfor(p);
p.destroy();
//转换完成后删除源文件
// if (isdelsourcefile) {
// deletefile(sourcevideopath);
// }
return
true
;
}
catch
(exception e) {
e.printstacktrace();
return
false
;
}
}
/**
* ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
* @param oldfilepath
* @return
*/
private
boolean
processflv(string oldfilepath) {
if
(!checkfile(sourcevideopath)) {
system.out.println(oldfilepath +
" is not file"
);
return
false
;
}
list<string> commend =
new
java.util.arraylist<>();
commend.add(ffmpegpath);
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(targetfolder + filerealname +
".flv"
);
try
{
processbuilder builder =
new
processbuilder();
string cmd = commend.tostring();
builder.command(commend);
process p = builder.start();
dowaitfor(p);
p.destroy();
deletefile(oldfilepath);
return
true
;
}
catch
(exception e) {
e.printstacktrace();
return
false
;
}
}
public
int
dowaitfor(process p) {
inputstream in =
null
;
inputstream err =
null
;
int
exitvalue = -
1
;
// returned to caller when p is finished
try
{
system.out.println(
"comeing"
);
in = p.getinputstream();
err = p.geterrorstream();
boolean
finished =
false
;
// set to true when p is finished
while
(!finished) {
try
{
while
(in.available() >
0
) {
character c =
new
character((
char
) in.read());
system.out.print(c);
}
while
(err.available() >
0
) {
character c =
new
character((
char
) err.read());
system.out.print(c);
}
exitvalue = p.exitvalue();
finished =
true
;
}
catch
(illegalthreadstateexception e) {
thread.currentthread().sleep(
500
);
}
}
}
catch
(exception e) {
system.err.println(
"dowaitfor();: unexpected exception - "
+ e.getmessage());
}
finally
{
try
{
if
(in !=
null
) {
in.close();
}
}
catch
(ioexception e) {
system.out.println(e.getmessage());
}
if
(err !=
null
) {
try
{
err.close();
}
catch
(ioexception e) {
system.out.println(e.getmessage());
}
}
}
return
exitvalue;
}
|
3)最后,编写测试类:convervideotest.java 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public
class
convervideotest {
public
void
run() {
try
{
// 转换并截图
string filepath =
"c:\\users\\wangdy\\desktop\\pics\\05.尚硅谷_svn_启动服务器.wmv"
;
convervideoutils cv =
new
convervideoutils(filepath);
string targetextension =
".mp4"
;
boolean
isdelsoursefile =
true
;
boolean
beginconver = cv.beginconver(targetextension,isdelsoursefile);
system.out.println(beginconver);
}
catch
(exception e) {
e.printstacktrace();
}
}
public
static
void
main(string args[]) {
convervideotest c =
new
convervideotest();
c.run();
}
}
|
这样就完成了整个视频格式的转换,在定义的目标视频文件夹和截图存放文件夹就可以看到转换后的视频和视频第一帧的截图了.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/wdy_2099/article/details/71453602 。
最后此篇关于Java使用ffmpeg和mencoder实现视频转码的文章就讲到这里了,如果你想了解更多关于Java使用ffmpeg和mencoder实现视频转码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我对此很陌生,我在这里的论坛上检查过答案,但我没有找到任何真正可以帮助我的答案。我正在尝试播放 res/raw 文件夹中的视频。到目前为止我已经设置了这段代码: MediaPlayer mp; @Ov
我可以播放一个视频剪辑,检测视频的结尾,然后创建一个表单,然后播放另一个视频剪辑。我的问题是,表单 react 不正确,我创建了带有提交按钮和两个单选按钮可供选择的表单。我希望让用户进行选择,验证响应
首先,我必须说我在web2py讨论组中看到过类似的内容,但我不太理解。 我使用 web2py 设置了一个数据库驱动的网站,其中的条目只是 HTML 文本。其中大多数将包含 img和/或video指向相
我正在尝试在视频 View 中播放 YouTube 视频。 我将 xml 布局如下: 代码是这样的: setContentView(R.layout.webview); VideoV
我正在开发一个需要嵌入其中的 youtube 视频播放器的 android 应用程序。我成功地从 API 获得了 RTSP 视频 URL,但是当我试图在我的 android 视频 View 中加载这个
我目前正在从事一个使用 YouTube API 的网络项目。 我完全不熟悉 API。所以每一行代码都需要付出很多努力。 使用以下代码,我可以成功检索播放列表中的项目: https://www.goog
是否可以仅使用视频 ID 和 key 使用 API V3 删除 youtube 视频?我不断收到有关“必需参数:部分”丢失的错误消息。我用服务器和浏览器 api 键试了一下这是我的代码: // $yo
所以我一直坚持这个大约一个小时左右,我就是无法让它工作。到目前为止,我一直在尝试从字符串中提取整个链接,但现在我觉得只获取视频 ID 可能更容易。 RegEx 需要从以下链接样式中获取 ID/URL,
var app = angular.module('speakout', []).config( function($sceDelegateProvider) {
我正在努力从 RSS 提要中阅读音频、视频新闻。我如何确定该 rss 是用于新闻阅读器还是用于音频或视频? 这是视频源:http://feeds.cbsnews.com/CBSNewsVideo 这是
利用python反转图片/视频 准备:一张图片/一段视频 python库:pillow,moviepy 安装库 ?
我希望在用户双击视频区域时让我的视频全屏显示,而不仅仅是在他们单击控件中的小图标时。有没有办法添加事件或其他东西来控制用户点击视频时发生的情况? 谢谢! 最佳答案 按照 Musa 的建议,附
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 7年前关闭。 Improve this questi
我有一个公司培训视频加载到本地服务器上。我正在使用 HTML5 的视频播放来观看这些视频。该服务器无法访问网络,但我已加载 apache 并且端口 8080 对同一网络上的所有机器开放。 这些文件位于
我想混合来自 video.mp4 的视频(时长 1 分钟)和来自 audio.mp3 的音频(10 分钟持续时间)到一个持续时间为 1 分钟的输出文件中。来自 audio.mp3 的音频应该是从 4
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 8年前关闭。 Improve this questi
我正在尝试使用 peer/getUserMedia 创建一个视频 session 网络应用程序。 目前,当我将唯一 ID 发送到视频 session 时,我能够听到/看到任何加入我的 session
考虑到一段时间内的观看次数,我正在评估一种针对半自动脚本的不同方法,该脚本将对视频元数据执行操作。 简而言之,只要视频达到指标中的某个阈值,就说观看次数,它将触发某些操作。 现在要执行此操作,我将不得
我正在通过iBooks创建专门为iPad创建动态ePub电子书的网站。 它需要支持youtube视频播放,所以当我知道视频的直接路径时,我正在使用html5 标记。 有没有一种使用html5 标签嵌入
我对Android不熟悉,我想浏览youtube.com并在Webview内从网站显示视频。当前,当我尝试执行此操作时,将出现设备的浏览器,并让我使用设备浏览器浏览该站点。如果Webview不具备这种
我是一名优秀的程序员,十分优秀!