一、 Ffmpeg,mencoder视频格式转换

 
Mencoder 转 flv 
mencoder -ffourcc FLV1 -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -of lavf -oac mp3lame -lameopts aq=9:cbr:br=64:vol=2 -ovc lavc -lavcopts vcodec=flv:vbitrate=200:acodec=mp3:abitrate=56 -vf scale=320:270,expand=320:270:::1,crop=320:270:0:0 -ofps 18 -srate 22050 input.xxx -o output.flv
Mencoder 转 avi 
mencoder.exe -oac mp3lame -lameopts aq=7:cbr:br=64 -srate 32000 -vf scale=220:176 -ovc lavc -ffourcc DX50 -lavcopts vcodec=mpeg4:vbitrate=320 "input.xxx" -o "output.avi" 
mencoder ..\v\wmv.wmv -o ..\v\wmv-3.flv -of lavf -oac mp3lame -lameopts abr:br=56 -srate 22050 -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3
 
mencoder -oac mp3lame -lameopts aq=7:cbr:br=64 -srate 32000 -vf scale=220:176 -ovc lavc -ffourcc DX50 -lavcopts vcodec=mpeg4:vbitrate=320 "input.xxx" -o "output.avi"
 
mencoder -oac mp3lame -lameopts aq=7:cbr:br=64 -srate 22050 -vf scale=320:-3 -ovc xvid -xvidencopts bitrate=600     "wmv.wmv" -o "wmv.avi"  
 
mencoder -oac lavc -lavcopts acodec=mp2:abitrate=64 -srate 22050 -vf scale=320:-3 -ofps 15 -ovc xvid -xvidencopts bitrate=400 rmvb.rmvb -o rmvb.avi
 
mencoder 1.rmvb -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600 -of avi -o rmvb.avi
 
RMVB转FLVCODE
mencoder -vf scale=320:240 -ffourcc FLV1 -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -ovc lavc -lavcopts vcodec=flv:vbitrate=200 -srate 22050 -oac lavc -lavcopts acodec=mp3:abitrate=56 ok\1.rmvb -o ok\rmvb.flv
 
利用ffmpeg的这两个参数,可以控制让ffmpeg来将一个大video劈分成许多小段的独立播放的文件。
-ss time_off        set the start time offset
-t duration         set the recording time
 
Mencoder截段参数:
-ss 0 
-endpos 120
 
FFmpeg 转 3gp:
ffmpeg -y -i **.** -ac 1 -acodec amr_nb -ar 8000 -ab 24 -s 128x96 [-vcodec mpeg4] -b 40k -r 8 **.3gp
 
FFmpeg 转 flv:
ffmpeg -i inputfile.xxx -ab 56 -ar 22050 -qmin 2 -qmax 16 -b 320k -r 15 -s 320x240 outputfile.flv
 
FFmpeg截图参数 
对视频文件截图: 
ffmpeg -i xxx.xxx -y -f p_w_picpath2 -ss 8 -t 0.001 -s 350x240 xxx.jpg
 
对已有flv截图: 
ffmpeg -i xxx.flv -y -f p_w_picpath2 -ss 8 -t 0.001 -s 350x240 xxx.jpg
 
把视频的前30帧转换成一个Gif : 
ffmpeg -i xxx.xxx -vframes 30 -y -f gif xxx.gif
 
截取从10秒开始持续10秒的片段
 
FFmpeg 加水印 参数:
ffmpeg -i inputfile.xxx -tagpict ":220:210" -ab 56 -ar 22050 -qmin 2 -qmax 16 -b 320k -r 15 -s 320x240 outputfile.flv
 
水印参数说明:
-tagpict ":220:210" 
(在ffmpeg所在目录中寻找0002.mjpg、mask.mjpg两个用作水印处理的图片文件,然后在指定的坐标,比如此处的:220:210,把水印在转码过程中添加到视频文件的每一桢上)
 
AviSynth加水印:
首先ffmpeg/Mencoder编译时需要--enable-avisynth;
转换参数:ffmpeg -y -i 1.avs -b 320k rmvb-avs.flv
1.avs编写格式:
video = DirectShowSource("rmvb.rmvb",15).BilinearResize(320,240)
logo = ImageSource("logo2.jpg")
logomask = ImageSource("mask2.jpg")
overlay(video,logo,mask=logomask)
 
 
 
mencoder 转 flv 同时加字幕水印
 
试了一下,可以加进去,但有些参数还设置不好.比如中文的字幕只显示成"_____",文件的各项设置
cd mencoder
mencoder ../file/test.mov -o ../flv/zbzbzb.flv -of lavf -oac mp3lame -lameopts abr:br=56 
-ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:v4mv:last_pred=3 -subpos 5 -subfont
-text-scale 10 -unicode -font c:\arial.ttf -sub ../file/test.srt -lavfopts 
i_certify_that_my_video_stream_does_not_use_b_frames -srate 22050 
pause
 
上面是在一个批处理文件中执行的,所以写成这样子
 
subpos 是说明字幕的位置:垂直方向上越大越靠下,水平方向的参数我没找到,最小0,最大100
subfont-text-scale 设置字体的大小
-unicode 文字编码方式,其他的没试过
-font 字体文件
-sub 你的字幕文
 
二、Ffmpeg使用语法
 
       ffmpeg [[options][`-i' input_file]]... {[options] output_file}...
 
     如果没有输入文件,那么视音频捕捉就会起作用。
 
     作为通用的规则,选项一般用于下一个特定的文件。如果你给 –b 64选项,改选会设置下一个视频速率。对于原始输入文件,格式选项可能是需要的。 
     缺省情况下,ffmpeg试图尽可能的无损转换,采用与输入同样的音频视频参数来输出。 
3.选项 
    我们在将多种格式的视频转换成flv格式的时候,我们关注的就是转换后的flv视频的品质和大小。下面就自己的实践所得来和大家分享一下,主要针对 avi、3gp、mp4和wmv四种格式来进行分析。通常在使用ffmpeg进行视频转换的时候我们使用到的控制音视频的主要参数有如下:
-ab      bitrate      设置音频码率
-acodec codec        使用codec编解码
-ac      channels     设置通道,缺省为1
-ar      freq         设置音频采样率
-r       fps          设置帧频,缺省25
-b       bitrate      设置比特率,缺省200kb/s
-qscale 6或4         使用动态码率来设置
    对于其他诸如-i、-y、-s等参数基本上都是可以很好理解的了。我们上面提到的几个参数前四个主要是用来设置音频的,后三个主要是用来设置视频的。对于 音频的ar(采样率)可以指定为22050、24000、44100或48000,一般来将后两种比较常见;对于音频的ab(码率)一般是选择32、 64、96或128这几种;对音频的acodec则是指定编码方式,可以指定为libmp3lame或aac等,这两种分别是指使用mp3和aac格式的 音频。在实际的测试过程中我发现在使用mp3进行音频编码时指定ab为64或更高和指定ar为22050或更高对实际的视频音质没有什么大的影响,请参见 后面的测试结果。
 
a) 通用选项
 
     -L license
 
     -h 帮助
 
     -fromats 显示可用的格式,编解码的,协议的。。。
 
     -f fmt 强迫采用格式fmt
 
     -I filename 输入文件
 
-y 覆盖输出文件
 
       -t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持
 
       -ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持
 
 
       -title string 设置标题
 
       -author string 设置作者
 
       -copyright string 设置版权
 
       -comment string 设置评论
 
      -target type 设置目标文件类型(vcd,svcd,dvd) 所有的格式选项(比特率,编解码以及缓冲区大小)自动设置 ,只需要输入如下的就可以了:
 
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
 
       -hq 激活高质量设置
 
       -itsoffset offset 设置以秒为基准的时间偏移,该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持
 
       b) 视频选项
 
              -b bitrate 设置比特率,缺省200kb/s
 
              -r fps 设置帧频 缺省25
 
              -s size 设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:
 
                     Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
 
              -aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
 
              -croptop size 设置顶部切除带大小 像素单位
 
              -cropbottom size –cropleft size –cropright size
 
              -padtop size 设置顶部补齐的大小 像素单位
 
              -padbottom size –padleft size –padright size –padcolor color 设置补齐条颜色(hex,6个16进制的数,红:绿:兰排列,比如 000000代表黑色)
 
              -vn 不做视频记录
 
              -bt tolerance 设置视频码率容忍度kbit/s
 
              -maxrate bitrate设置最大视频码率容忍度
 
              -minrate bitreate 设置最小视频码率容忍度
 
              -bufsize size 设置码率控制缓冲区大小
 
              -vcodec codec 强制使用codec编解码方式。 如果用copy表示原始编解码数据必须被拷贝。
 
 
              -sameq 使用同样视频质量作为源(VBR)
 
              -pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
 
              -passlogfile file 选择两遍的纪录文件名为file
 
              -
 
      c)高级视频选项
 
             -g gop_size 设置图像组大小
 
             -intra 仅适用帧内编码
 
             -qscale q 使用固定的视频量化标度(VBR)
 
             -qmin q   最小视频量化标度(VBR)
 
             -qmax q 最大视频量化标度(VBR)
 
             -qdiff q 量化标度间最大偏差 (VBR)
 
             -qblur blur 视频量化标度柔化(VBR)
 
             -qcomp compression 视频量化标度压缩(VBR)
 
             -rc_init_cplx complexity 一遍编码的初始复杂度
 
             -b_qfactor factor 在p和b帧间的qp因子
 
             -i_qfactor factor 在p和i帧间的qp因子
 
             -b_qoffset offset 在p和b帧间的qp偏差
 
             -i_qoffset offset 在p和i帧间的qp偏差
 
             -rc_eq equation 设置码率控制方程 默认tex^qComp
 
             -rc_override override 特定间隔下的速率控制重载
 
             -me method 设置运动估计的方法 可用方法有 zero phods log x1 epzs(缺省) full
 
             -dct_algo algo 设置dct的算法 可用的有 0 FF_DCT_AUTO 缺省的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
 
             -idct_algo algo 设置idct算法。可用的有 0 FF_IDCT_AUTO 缺省的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
 
             -er n 设置错误残留为n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE
 
-ec bit_mask 设置错误掩蔽为bit_mask,该值为如下值的位掩码 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
 
             -bf frames 使用frames B 帧,支持mpeg1,mpeg2,mpeg4
 
             -mbd mode 宏块决策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
 
             -4mv 使用4个运动矢量 仅用于mpeg4
 
             -part 使用数据划分 仅用于mpeg4
 
             -bug param 绕过没有被自动监测到编码器的问题
 
             -strict strictness 跟标准的严格性
 
             -aic 使能高级帧内编码 h263+
 
             -umv 使能无限运动矢量 h263+
 
             -deinterlace 不采用交织方法
 
             -interlace 强迫交织法编码 仅对mpeg2和mpeg4有效。当你的输入是交织的并且你想要保持交织以最小图像损失的时候采用该选项。可选的方法是不交织,但是损失更大
 
             -psnr 计算压缩帧的psnr
 
             -vstats 输出视频编码统计到vstats_hhmmss.log
 
             -vhook module 插入视频处理模块 module 包括了模块名和参数,用空格分开
 
      D)音频选项
 
             -ab bitrate 设置音频码率
 
             -ar freq 设置音频采样率
 
             -ac channels 设置通道 缺省为1
 
             -an 不使能音频纪录
 
             -acodec codec 使用codec编解码
 
      E)音频/视频捕获选项
 
             -vd device 设置视频捕获设备。比如/dev/video0
 
             -vc channel 设置视频捕获通道 DV1394专用
 
             -tvstd standard 设置电视标准 NTSC PAL(SECAM)
 
             -dv1394 设置DV1394捕获
 
             -av device 设置音频设备 比如/dev/dsp
 
            
 
     F)高级选项
 
             -map file:stream 设置输入流映射
 
             -debug 打印特定调试信息
 
             -benchmark 为基准测试加入时间
 
             -hex 倾倒每一个输入包
 
             -bitexact 仅使用位精确算法 用于编解码测试
 
             -ps size 设置包大小,以bits为单位
 
             -re 以本地帧频读数据,主要用于模拟捕获设备
 
             -loop 循环输入流。只工作于图像流,用于ffserver测试
 
 
 
 
先从ffmpeg开始。
http://ffmpeg.sourceforge.net 上有说明,音视频的分离,转换,解码的完全解决方案。
其中最重要的就是libavcodec库。它被mplayer或者xine使用作为×××。还有,国内比较流行的播放器影音风暴或MyMPC的后端ffdshow也是使用ffmpeg的解码库的。
 
ffmpeg包括一组软件,ffmpeg用于对媒体文件进行处理,ffserver是一个http的流媒体服务器,ffplay是一个基于SDL的简单播放器。两个库文件libavcodec和libavformat。
 
ffmpeg作为媒体文件处理软件,基本用法如下:
ffmpeg -i INPUTfile [OPTIONS] OUTPUTfile
输入输出文件通常就是待处理的多媒体文件了。可以是纯粹的音频文件,纯粹的视频文件,或者混合的。
大部分常见的格式都能够“通杀”。象常见的各种mpeg,AVI封装的DIVX和Xvid等等
具体的格式支持列表可以使用ffmpeg -formats查看或直接查阅文档。
 
另:由于Linux把设备视为文件,因此-i选项后可以跟设备名。比如DV,视频卡,光驱或者其它的各类设备。
输出的内容通过Options调整。列出几个主要的选项
-vcodec 视频流编码方式
-b       视频流码率(默认只有200k,一般都需要手动设置,具体的数值视codec选择而定)
-r        视频流帧数(一般说来PAL制式通常用25,NTSC制式通常用29)
-s        视频解析度(分辨率,也要视codec和你的需要而定。通常改变某个视频流的解析度是很耗费CPU的事情。另:具体写法使用“数字x数字”的形式。中间是小写字母“x”,这个用过mplayer的应该都知道)
-t        处理持续时间。
-acodec 音频流编码方式
-ab         音频流码率(默认是同源文件码率,也需要视codec而定)
-ar          音频流采样率(大多数情况下使用44100和48000,分别对应PAL制式和NTSC制式,根据需要选择)
 
还有些可能需要用到的选项如
-vn和-an分别是屏蔽视频流和屏蔽音频流,分别对源文件处理一次即可得到分离的音频和视频
-author -title分别是设置媒体文件的作者和title
-f选项是强制使用某种格式
-target type是使用预置的格式转换(可以转成dvd,vcd或svcd)
 
除此之外还有些更高级的选项,如设定vbr,或设定high quality,或者设定vbr的buff和max/min码率,象一般我们自用的dvd抓轨啦,DV转vcd或dvd啦,网上下载的电影转成vcd或dvd都不一定需要用到它们。
具体的使用方法在man里面有介绍。简单明了。 
 
三、 ffmpeg转换flv
 
    对于视频的r用来指定帧频,一般设置为29.97;对于视频的b(视频的比特率)可以指定如128、314等数字,对于1500以上则没有效果;对于视频 的qscale,属于动态码率,可以设置为4或6,4的质量比6的要高。在测试的过程中我发现设置-b参数对视频的质量并没有过大的改变(指定大指定小都 差不多或是一样),而设置qscale则完全不一样,如果我们想获取高品质的话应该使用动态码率而不是指定-b参数,当然了,使用动态码率的坏处就是视频 的体积变大了。在使用动态码率的时候使用6的效果和4差不多,但是体积减少了,因此通常建议使用6来设置动态码率。
 
    上面介绍了转换过程中的音视频的配置参数,综合上面,我们在转换的时候通常的命令如下:
高品质:ffmpeg -i infile -ab 128 -acodec libmp3lame -ac 1 -ar 22050 -r 29.97 -qscale 6 -y outfile
低品质:ffmpeg -i infile -ab 128 -acodec libmp3lame -ac 1 -ar 22050 -r 29.97 -b 512 -y outfile
 
使用这两个命令测试四种格式的视频结果如下,同时在测试的过程中会改变相应的参数进行测试,四个视频的信息如下:
AVI格式的:test.avi      14.1M
3GP格式的:test.3gp      4.30M
MP4格式的:test.mp4      16.4M
WMV格式的:test.wmv      15.0M
 
1.使用高品质的脚本测试结果如下:
AVI格式转换后的:-qscale 6结果=avi_01.flv   6.61M      -qscale 4结果=avi_02.flv   9.30M
3GP格式转换后的:-qscale 6结果=3gp_01.flv   4.21M      -qscale 4结果=3gp_02.flv   5.30M
MP4格式转换后的:-qscale 6结果=mp4_01.flv   13.1M      -qscale 4结果=mp4_02.flv   17.5M
WMV格式转换后的:-qscale 6结果=wmv_01.flv   15.9M      -qscale 4结果=wmv_02.flv   22.3M
 
2.使用低品质的脚本测试结果如下:
AVI格式转换后的:-b 512结果=avi_03.flv   2.87M      -b 1000结果=avi_04.flv   2.87M
3GP格式转换后的:-b 512结果=3gp_03.flv   1.73M      -b 1000结果=3gp_04.flv   1.73M
MP4格式转换后的:-b 512结果=mp4_03.flv   5.84M      -b 1000结果=mp4_04.flv   5.84M
WMV格式转换后的:-b 512结果=wmv_03.flv   6.17M      -b 1000结果=wmv_04.flv   6.17M
 
3.压缩率比较如下:
AVI格式转换后的:-qscale 6结果=53.12%   -qscale 4结果=34.04%   -b 512/1000结果=79.65%
3GP格式转换后的:-qscale 6结果=2.093%   -qscale 4结果=123.1%   -b 512/1000结果=59.77%
MP4格式转换后的:-qscale 6结果=20.12%   -qscale 4结果=106.7%   -b 512/1000结果=64.39%
WMV格式转换后的:-qscale 6结果=106.0%   -qscale 4结果=148.7%   -b 512/1000结果=58.87%
 
    通过比较前后的压缩大小我们可以看到在音频保持一致的情况下,使用高品质的转换和使用低品质的转换的巨大差异,同时对于不同格式的视频在转换的过程中也会 出现比较大的差异。当然了,这些数据并不一定代表所有这些格式的视频都是如此,具体的要看大家的应用了。不过,我们可以确定的是AVI格式的视频在转换成 FLV格式后其压缩率最大,不过对于不同编码的AVI其结果就不一定了。同时我们也还看到,对于某些格式的视频在转换后其体积比原先的还大了,这个我们在 应用的时候就需要注意了。