博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

使用Mencoder进行视频转换遇到的问题和相关解决方案

Posted on 2007-06-22 11:12  单摆  阅读(4305)  评论(7编辑  收藏  举报

       刚开始做视频转换的时候只打算用Mencoder转换rm、rmvb、rt格式的文件,其他格式的文件ffmpeg转换,编码完成,测试的时候发现用ffmpeg转换出来的Flv文件播放效果很不理想,最后就都改成用Mencoder转换,尽管他的转换速度不如ffmpeg,在我的解决方案种ffmpeg只用来截图。

问题1:转换程序要加在哪里?
用过Mencoder的都知道,转换视频的时间比较久,而且很占CPU和内存,所以没有办法实时转换。只能另外写一个后端服务程序转换,另外刚刚说过了Mencoder很占CPU和内存,所以转换服务最后能部署到另外一台服务器。

问题2:转换流程?
我的转换流程是:从数据库获取尚未转换的视频(含转换失败次数少于10次,当然次数可以自己定义)->添加到转换队列->取出队列前面的一个视频-->开始转换->判断是否转换结束->判断是否转换成功,成功了标记数据库相关字段转换成功,不成功转换失败错误次数加1->继续一下一个视频转换....

不知道大家有没有更好的流程?如果有麻烦你告诉我下,我补充上去。

问题3:如何判断转换结束?
可以获取转换过程中的输出信息(获取当前的转换进度、获取什么时候完成转换),必须设置process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true;然后必须通过异步编程的方式获取Process.StandardOutput和Process.StandardError的值,相关说明可以见(ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemDiagnosticsProcessClassStandardOutputTopic.htm),具体实现当然要写一堆的代码。

问题4:如何提高视频的转换质量和文件大小(不是尺寸)?

这个问题估计大家非常关心,网络上提供了不少的例子,但是对如何提高视频质量都没有做出解答,

下面这3个参数决定了视频的转换质量
vbitrate:视频数据速率
ofps:帧频
br:音频比特率


开始的时候我上面的参数都是设定固定值,结果转换出来的视频有的质量还不错,有的质量不行,有的文件还很大(客户是拿国内比较出名的视频网站进行比较),尽管我调整了很多参数值,效果还是不理想,后来突然想起原始的视频的上面这些参数都是不一样的,设定固定值效果肯定不理想,如果获取了视频原始的上述参数值就可以用原始的值进行转换了,这样效果肯定不错。查了一下资料,发现用MediaInfo.dll(Library for read info about media files)这个第三方组件可以获取视的相关信息。

问题5:如何处理转换过程中的异常?
Mencoder在多个CPU的服务器转换会有问题,不是每个文件都会有问题,多数是转换到40%-70%就跳出一个错误对话框,我测试的结果是rm类型文件经常报错,好像和解码器drv43260.dll有关系,网络上也有很多人提这个问题,使用了他们的方法也不行,用Mencoder相关网站说多CPU的版本也不行,我现在的解决方法是设置线程的处理器,就是让Mencoder只用一个CPU工作,但是这样的话转换的速度就变慢了,有条件的可以使用两个转换服务器,一个不限定cpu,另外一个限定只使用一个CPU,用来专门处理转换失败的文件,这样就可以提高转换速度了。尽管如此,还是会有异常产生,有的文件(这种概率非常的少,0.3%左右),一开始转换就错误了,这时还没来得及指定CPU,因为必须是线程启动后才能指定CPU的,这种情况虽然概率小,但是一旦发生,就会使整个转换程序停在那里,不会再继续了。我的解决方案是用一个变量去记录Mencoder最后工作时间(在输出的时候记录,因为Mencoder工作的时候挥不断的输出当前信息,如进度),在判断当前转换是否结束的函数中,发现当前Mencoder超过10分钟没有工作的话,就直接kill当前进程,继续下一个视频的转换。

上述问题,欢迎大家提出更好的解决方案


其他问题可以参考我的另外一篇关于视频的随笔:
利用ffmpeg+mencoder视频转换的总结http://www.cnblogs.com/csky/archive/2007/03/13/673140.html