名词解释:
浏览器播放:部署在apache下的mp4模块,通过浏览器访问。
手机播放:部署在tomcat下,通过手机访问。
首先需要知道android支持mp4文件播放。
在此前提下,我们需要用ffmpeg为android生成特定格式的文件。
废话不多说,直接上命令:
用此命令转换后的文件可以在android下播放,但是效果不是很好,有马赛克。
于是调整影响画面的参数:比特率。
在分别使用了
-b 600
-b 800
-b 1000
等众多参数之后,效果依然没有明显改善,于是想到用非恒定码率,也许效果会比较好,见:http://blog.csdn.net/applezhengxd/archive/2009/12/17/5025703.aspx
分别使用了
-qscale 4
-qscale 6
但是最终的效果仍然不理想。
那么为什么要用这个命令呢,因为这是apahce给出的在apache的mp4模块下进行流传输的转换命令,我想要找到一个通用的命令,所以首先拿这个命令开刀。但是他使用的是libx264高压缩比,而且进行了两次转码,会不会是这个影响的呢?
带着这个疑问,我使用了一次转码的命令,并且使用压缩率较低的解码器。
ffmpeg -y -i test.avi -vcodec libxvid -s 320x240 -r 30 -b 600k -acodec libfaac -ab 128k -ar 48000 -ac 2 -f mp4 test.mp4
用这个命令生成的文件在手机上播放果然没有问题,很流畅,几乎没有马赛克。
带着喜悦,我有相继测试了其他格式的视频文件的转换,但是问题又来了。
当inputfile为flv的时候,执行命令报错了:Video encoding failed。
看来是解码器用的不对,于是换其他的,折腾一番,无功而返。
最后干脆将-vcodec libxvid参数去掉,成功了!
查看转换后的文件的属性,是mpeg4,符合要求。
于是我又用修改后的命令
ffmpeg -y -i test.avi -s 320x240 -r 30 -b 600k -acodec libfaac -ab 128k -ar 48000 -ac 2 -f mp4 test.mp4
测试了先前测试成功的文件,都没有问题。
虽然没有找到一个通用的转换命令,但是现在做的工作都已经满足需求了。
测试总结:
两次转码的命令得到的文件,可以在浏览器、手机上播放,只是在后者上效果很不好。
一次转码的命令得到的文件,可以在手机上播放,效果不错,但不能在浏览器上播放,因为不符合apache下mp4模块的h264/mp4要求。
ffmpeg对文件格式的支持从avi、mov、mpg、flv、3gp转换后的效果依次降低,也就是说同样的命令,由3gp得到的文件效果最差。
不论是什么命令生成的mp4文件都需要经过MP4Box处理后才能在手机上播放,MP4Box -hint filename.mp4