java flv转换 有感
最近一段时间由于工作原因所要求,开发的网站得有用户视频上传的功能.上传是好说,关键在于如何将用户上传视频的同时转换成flv格式,以便能便网页的flash播放器中正常播放.所以在网上寻觅了一些资料,最终确定ffmpeg这个插件.学习之后进行了些许配置,如下:
public static boolean processFLV(String ffmpegpath, String inputpath,
String outputpath) {
List<String> commend = nejava.util.ArrayList<String>();
commend.add(ffmpegpath);
commend.add("-i");
commend.add(inputpath);
commend.add("-y");
commend.add("-ab");
commend.add("56");
commend.add("-ar");
commend.add("22050");
commend.add("-r");
commend.add("15");
commend.add("-s");
commend.add("300*200");
commend.add(outputpath);
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.start();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
存在的问题主要有以下几点:
其一:无法通过代码获知该上传的视频文件何时完成转换flv格式的文件(我的本意是在用户上传成功之后马上进行转换,然后删除用户上传的源视频文件,但是通过上面的代码配置,一个几M的视频文件所需要的转换时间都要几分钟,很郁闷,如何删除?).我的解决办法是在表里面加一个字段,一个字段手于保存用户上传的视频文件路径(上传到文件中,没有进数据库),另外一个字段用于保存奖要生成的flv格式的文件路径.展转反侧,还是觉得特别别扭,原本只要一个视频文件的想法现在却不得不要两个文件夹来单独保存...难道没有别的办法了? 为什么3gp的转换不了,生成出来的flv大小为零... 4 楼 xiaoao808 2010-01-25 转换进程挂起是因为保存输出信息的缓冲区满了,我也为这个郁闷过好一阵,好在解决了,可以看看这里http://www.cnblogs.com/xiaoao808/archive/2009/08/04/1538824.html 5 楼 lyh20081984 2010-01-25 xiaoao808 写道转换进程挂起是因为保存输出信息的缓冲区满了,我也为这个郁闷过好一阵,好在解决了,可以看看这里http://www.cnblogs.com/xiaoao808/archive/2009/08/04/1538824.html
感谢,这个困难上午已经克服了,可是我就是不懂,为啥支持的3gp格式却转换不了... 6 楼 jay88489 2010-01-26 楼主和我几年前遇到同样的问题
http://topic.csdn.net/u/20070228/10/418a365d-cc3f-4ab7-ae4c-ccda40963a11.html 7 楼 jay88489 2010-01-26 Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.
http://zhanghaoeye.iteye.com/blog/552007 8 楼 aoliwen521 2010-01-26 我在linux下 wav转MP3,用的类似方式。
sox + lame 9 楼 snailq 2010-01-26 我也做过这样的应用开发,我想你可能需要注意以下几个问题:
(1)首先视频转换应该作为一个单独的后台线程来处理,这样不会影响前台的其他操作。
(2)视频转换线程调用外部进程ffmpeg转换视频时,要用如下代码:
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
String cmd=commend.toString();
builder.redirectErrorStream(true);
p=builder.start();
//read the standard output
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
//System.out.println(line);
continue;
}
int ret = p.waitFor();//这里线程阻塞,将等待外部转换进程运行成功运行结束后,才往下执行
/*转换完后,进行后续操作,比如:在数据库中加一个字段,来判断是否转换成功了,是否可删除原
视频文件;进行视频修复等*/
(3)、ffmpeg转换的视频,要flvtools修复,flash播放器才能计算出flv的播放时间,并进行拖放操作。因为ffmpeg转换原视频文件,都会破坏flv的关键帧和时间元数据。
(4) 、用mencoder在ffmpeg转flv格式前,把ffmpeg不能识别的格式,转为ffmpeg可以处理的格式。 10 楼 vb2005xu 2010-01-27 就不能实现个类似触发器的功能么? 为每个视频转换加上 一个 完成事件,在这个事件中触发完成提示操作..
11 楼 viei 2010-01-27 还是走异步处理,然后事后通知的路子把 12 楼 java新手上路 2010-07-31 jay88489 写道Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.
http://zhanghaoeye.iteye.com/blog/552007
我就搞不懂你,为什么要用英文呢 ?