论坛首页 Java企业应用论坛

java flv转换 有感

浏览 11035 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (12) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-24  
最近一段时间由于工作原因所要求,开发的网站得有用户视频上传的功能.上传是好说,关键在于如何将用户上传视频的同时转换成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格式的文件路径.展转反侧,还是觉得特别别扭,原本只要一个视频文件的想法现在却不得不要两个文件夹来单独保存...难道没有别的办法了?
   发表时间:2010-01-25  
使用waitFor确定builder执行成功之后,你就可以做你要的操作了

你的builder只start()了,没有判断是否执行成功

几M的要几分钟,可能是你转码服务器的性能问题,这个对服务器的CPU要求很高
0 请登录后投票
   发表时间:2010-01-25  
依照上面这位仁兄的说法,我加了如下代码:
Process process = builder.start();
process.waitFor();--这里未写判断,只是测试
可是出现了问题,这个方法是导致当前的本地线程等待,在此期间我反复观察转化的进度,发现一直没动,当我把整个项目停止运行之后他才又开始转换...郁闷不?
0 请登录后投票
   发表时间:2010-01-25  
为什么3gp的转换不了,生成出来的flv大小为零...
0 请登录后投票
   发表时间:2010-01-25  
转换进程挂起是因为保存输出信息的缓冲区满了,我也为这个郁闷过好一阵,好在解决了,可以看看这里http://www.cnblogs.com/xiaoao808/archive/2009/08/04/1538824.html
0 请登录后投票
   发表时间:2010-01-25  
xiaoao808 写道
转换进程挂起是因为保存输出信息的缓冲区满了,我也为这个郁闷过好一阵,好在解决了,可以看看这里http://www.cnblogs.com/xiaoao808/archive/2009/08/04/1538824.html

感谢,这个困难上午已经克服了,可是我就是不懂,为啥支持的3gp格式却转换不了...
0 请登录后投票
   发表时间:2010-01-26  
楼主和我几年前遇到同样的问题

http://topic.csdn.net/u/20070228/10/418a365d-cc3f-4ab7-ae4c-ccda40963a11.html
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2010-01-26  
我在linux下 wav转MP3,用的类似方式。
sox + lame
0 请登录后投票
   发表时间: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可以处理的格式。
3 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics