11
2014
09

Flv转Mp4经验

转码的问题终于解决了!怎么样才能让Flv转成mp4,清晰度、兼容性和文件大小都能综合到位?下面分享一下我的经验。

当前项目:php+mysql的视频网站,这个平台可以将各种视频上传并转换成flv的,前台用flash播放flv视频。
新增功能:开发一个手机客户端,实现在手机上看视频。
问题难点:flv的文件在手机上可以播放,但都要用手机上的播放器才可以打开,只有3gp、mp4的可以直接播放。
大家现在很明白我们要干什么了吧,★就是要把flv转成mp4的视频格式★。

第一套方案:用FFmpeg转换,这个工具很不错,一个命令行就可以实现转换,刚开始就是用这种方法。
但后来发现用它转出来的视频,清晰度太差,在我的小米2S上都看不清楚,只能放弃,下面是我使用的具体命令行:

路径\ffmpeg.exe -y -i "FLV文件.flv" -r 29.97 -b 1500 -s 320x240 -ab 256k "MP4文件.mp4"

FFmpeg各参数的含义是:
-y 有文件存在时,直接覆盖;
-i "FLV文件.flv" 输入的文件,就是要转换的原始文件;
-title "Test" 在PSP中显示的影片的标题;
-r 29.97 视频帧数;
-b 1500 视频数据流量,用-b xxxx的指令则使用固定码率,数字随便改,1500以上没效果;
-qscale 4 视频质量,取值范围是0.01-255,越小越清晰,文件越大,和-b参数交换使用;
-s 320x240 输出的分辨率为320x240,注意片源一定要是16:9的,不然会变形;
-ab 256k 音频数据流量,一般选择32、64、96、128、256;
-ac 2 音频声道数 1或者2;
-vol 200 200%的音量;
-f psp 输出psp专用格式;
"***.mp4" 输出文件名,也可以加路径。


例子:"E:\ffmpeg.exe -y -i "E:\2.flv" -title "Test" -vcodec xvid -s 320x240 -r 29.97 -b 1500 -acodec aac -ac 2 -ar 24000 -ab 128 -vol 200 -muxvb 768 "E:\2.mp4"


第二套方案:用Mencoder转换,这个和FFmpeg差不多,转出来的视频用普通播放器是可以播放的,但放到手机上就是播不了,不过这个工具很不错,接下来,我们还是要用到它的。

"路径\mencoder.exe" "FLV文件.flv" -af volnorm -srate 48000 -vf-add scale=320:240,harddup -ofps 30000/1001 -oac faac -faacopts br=128:mpeg=4:object=1 -ovc xvid -xvidencopts bitrate=500:max_bframes=0 -o "MP4文件.mp4"

Mencoder各参数的含义是:

-oac mp3lame:(output audio codec)指定输出媒体文件的音频编码类型。此例中选择的是 mp3lame。其它可以选择的编码如下表所示:
-lameopts aq=3:abr:br=128:(lame options)指定 LAME 的编码设置。aq 为编码质量,它的值为 0~9,数字越小音频的数字失真就越小,编码的时间就越长;编码方式包括有 abr(按平均码率编码)、cbr(指固定码率编码)、vbr(按动态码率编码)三种;br=128 则指定编码码率为 128kbps。
-srate 44100:(sample rate)指定音频的采样频率。频率通常有 22050、32000、44100 等几种。
-ovc lavc:(output video codec)指定输出媒体文件的视频编码类型。此处选择的是 Libavcodec 的视频编码,其它可以选择的编码如下表所示:
-lavcopts vcodec=mpeg4:vbitrate=1200:(Libavcodec options)指定视频编码的设置。由于 Libavcodec 包含了多种视频编码,所以用 vcodec=mpeg4 来指定具体的使用 MPEG-4 编码,vbitrate 是设定视频编码的码率为 1200kbps。
-fourcc DX50:(four character code)指定视频数据流格式的四字符代码。通常视频播放软件通过查询 FourCC 代码并且寻找与 FourCC 代码相关联的视频解码器来播放特定的视频流。比如 DIV3 = DivX Low-Motion、DIV4 = DivX Fast-Motion、DIVX = DivX4、DX50 = Divx5 等等。
-vf scale=480:360,crop=640:478:0:0,harddup:(video filters)指定编码的视频滤镜设置。scale=480:360 用于指定输入媒体文件的画面大小,宽度为 480 像素,高度为 360 像素。crop=638:477:1:2 是剪栽选项,从原始画面的座标(1,2)为起点,截取 638×477 像素的图像。
注意,命令里的 scale 参数放在 crop 参数之前,表示“先缩放后剪栽”,如果 crop 参数放于 scale 参数之前,则表示“先剪栽后缩放”。
-ofps 30:(output fps)指定输出媒体文件的帧速,30fps 指每秒种播放 30 个画面。
-o output.avi:(output)指定转换后输入媒体的文件名。


第三套方案:用Mencoder + mp4box转换,这是个不错的组合,清晰度、兼容性和文件大小比较合适,就是过程有点复杂,要先用Mencoder把flv转成avi,再把avi分割成m4v视频aac音频文件,最后用mp4box合并。

MP4Box介绍:
MP4Box是多媒体打包器,它可以被用来对诸如AVI, MPG, TS, 但更多地是对诸如MP4, 3GP之类的ISO文件进行添加、移除、混流操作,执行流的加密操作,将元数据附着到单独的流上去,MP4Box可以对ISO媒体文件的已经存在的内容进行重新封装,值得注意的是,MP4Box并不会重新编码视频、音频或者是静态图像。
常用命令通用选项:
-tmp dir:指定生成临时文件的目录;
-inter Duration:将chunk的media数据按指定间隔进行交错,用于优化流传输或文件访问,所有meta数据放在文件头部,允许在下载的内容内回放。默认交错0.5s,若指定为0,则所有meta数据存在于文件头;
-tight:对媒体轨道执行基于采样的交错(生成文件较大)。在服务器侧为减少磁盘查找时间,用于hint文件时;
-flat:强制采用平坦存储,媒体数据不进行交错,meta数据在于文件结束。当使用-add创建新文件时,将不会创建临时文件;
-isma:把文件处理为isma规范格式;
-3gp:移除mpeg4系统信息,转换成3gp规范,保留音、视、文本轨道等3gp支持的;
-rem trackID:从文件中移除轨道,轨道分离;
-raw TrackID:分离轨道到它原本的格式;
-raws TrackID:分离每一个轨道到它原本的格式;
-avi TrackID:分离视频轨道到avi格式(支持MPEG-4 Visual和AVC/H264格式);
-nhnt TrackID:分离轨道到NHNT格式;
-nhml TrackID:分离轨道到NHML格式;

以上的MP4Box介绍都是官方的,在我的项目中用不到这么多的参数!

最终的操作命令行如下:
"路径\mencoder.exe" "路径\2.flv" -af volnorm -srate 48000 -vf-add scale=320:240,harddup -ofps 30000/1001 -oac faac -faacopts br=128:mpeg=4:object=1 -ovc xvid -xvidencopts bitrate=500:max_bframes=0 -o "路径\2.avi"
"路径\mencoder.exe" -ovc copy -nosound -of rawvideo -o "路径\2.m4v" "路径\2.avi"
"路径\mencoder.exe" -ovc frameno -oac copy -of rawaudio -o "路径\2.aac" "路径\2.avi"
"路径\MP4Box.exe" -fps 29.97 -add "路径\2.m4v"#video -add "路径\2.aac"#audio -new "路径\2.mp4"

过程是用点复杂,但效果还是不错的,吐了这么多,大家还有什么不清楚的,可以加QQ讨论:26051639。如果是命令行不清楚的话,可以到网上搜一下。






« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。