我在服务器上开发了一个视频编码的应用程序,在使用MEncoder编码视频时遇到了一个问题。命令行运行时,此解码器不能正常工作
Runtime.getRuntime().exec(“D:\mencoder\mnc\mencoder.exe video1.avi -o outvideo1.flv -of lavf -oac mp3lame -lameopts abr:br=64 -srate 22050 -ovc lavc -lavcopts vcodec=flv:vbitrate=300:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240,harddup -quiet”) ;解码器使用我的参数启动并在windows控制台中工作,但当它从servlet运行时,它只是挂在进程列表中,并且在web服务器停止之前不做任何事情。当试图从一个简单的java应用程序中使用解码器时,它可以正确运行。谢谢你的帮助。
发布于 2011-01-05 07:52:06
这绝对是一种不好的方式。一般来说,mencoder花费的时间会比用户愿意等待的时间长得多。此外,如果mencoder泄漏内存或崩溃,则可能会导致整个jvm崩溃。您也无法控制产生了多少这样的进程。一个更好的解决方案是有一个jms队列,或者一个可以插入的数据库。然后,您有另一个批处理作业来拾取这些视频并处理这些视频。如果您使用数据库方法,则可以随着进度更新数据库,并使用户获得最新的进度统计信息。通常,将这种运行时执行放在您的web应用程序容器之外。
发布于 2013-05-13 12:08:31
它不工作的原因是因为MPlayer在终端中输出了很多东西,一旦它的输出达到4096字节( Linux上的管道缓冲区限制),进程就会在下一个printf上挂起,直到在管道的另一端读取了一些数据。在您的情况下,它永远挂起,因为您没有读取标准输出和错误流。
为了解决这个问题,您可以在启动进程后立即关闭这些流:
Process p = Runtime.getRuntime().exec(“D:\mencoder\mnc\mencoder.exe video1.avi -o outvideo1.flv -of lavf -oac mp3lame -lameopts abr:br=64 -srate 22050 -ovc lavc -lavcopts vcodec=flv:vbitrate=300:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240,harddup -quiet”) ;
p.getInputStream().close();
p.getOutputStream().close();
p.getErrorStream().close();https://stackoverflow.com/questions/4599140
复制相似问题