印视频转换总结(win):
一. 视频转换水印资料的搜集整理如下:
二. 1.现在网络上大多都用页面中内嵌flash播放器播放flv格式的视频,原理是通过mencoder+ffmpeg+avisyth通过mencoder将上传的视频通转换为avi格式,用ffmpeg将avi格式转换为flv格式,在配合avisyth添加水印,字幕,以及格式的转换等,了解到还有一种添加水印的方式就是用ffmpeg将视频按每一帧截图,添加水印,再用mencoder将图片合成视频,比较繁琐。
三. mencoder(隶属Linux下MPlayer播放器的一个插件)
1.转换格式:
mencoder 7.wmv -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600 -of avi -o 7.avi
2.字幕格式:(一般是通过.srt的文件来加字幕的)
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
四. ffmpeg(有很多版本,我用的是svn)
1.转换格式:
C:\ffmpeg\ffmpeg –y –i c:\avi\1.avi –ab 56 –ar 22050 –r 15 –b 320k –s 320*240 c:\1.flv
2.水印格式
①:ffmpeg -y -i 1.avs -b 320k avs.flv
②:mpeg -i /home/erlang/1.wmv -vhook ‘/usr/lib/vhook/watermark.so -m 1 -f logo.png’ test_1.mpg(我找到了vhook文件夹,但不知道如何编译入ffmpeg)
五.AviSyth(是一个滤镜,也可以叫插件,有自己的语法)
编写格式:
LoadPlugin("C:\WINDOWS\system32\vsfilter.dll")
video =DirectShowSource("C:/ffmpeg/avi/3.avi")
logo = ImageSource("C:/ffmpeg/logo.png")
logomask = ImageSource("C:/ffmpeg/logo.png")
overlay(video,logo,mask=logomask, opacity=0.8)
Subtitle("Anterms software",size=28, align=2, first_frame=0, last_frame=1000)
a1 = FadeIO0(ImageSource("c:/1.jpg", 0, 124, 25), 7)
a2 = FadeIO0(ImageSource("c:/2.jpg", 0, 124, 25), 7)
return a1 + a2
六.在c#中的调用
Process p = new Process();//建立外部 调用 线程
p.StartInfo.FileName = @"c:\ffmpeg1\ffmpeg.exe";//要调用外部程序的绝对路径
p.StartInfo.Arguments = @"-i c:\1.avs -ab 56 -ar 22050 -b -r c:\text123.flv";//参数(这里就是FFMPEG的参数了)
p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序 启动 线程(一定为FALSE)
p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中
p.StartInfo.CreateNoWindow = false;//不创建 进程 窗口
p.Start();//启动线程
p.BeginErrorReadLine();//开始异步读取
p.WaitForExit();//阻塞等待进程结束
p.Close();//关闭进程
p.Dispose();//释放资源
七:可能出现的问题,只能转换其中几种,或者转换后播放视频倒着,或者用mencoder转换后的没法加水印,出现未找到用于流呈现的筛选器,解决方法,安装ffdshow解码器,给avisyth配置相应的参数和插件,通过avs的加载插件或者从注册表更改对应的选项即可。
附录:
一.Ffmpeg的参数内容
-formats 输出所有可用格式
-f fmt 指定格式(音频或视频格式)
-i filename 指定输入文件名,在linux下当然也能指定:0.0(屏幕录制)或摄像头
-y 覆盖已有文件
-t duration 记录时长为t
-fs limit_size 设置文件大小上限
-ss time_off 从指定的时间(s)开始, [-]hh:mm:ss[.xxx]的格式也支持
-itsoffset time_off 设置时间偏移(s),该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持
-title string 标题
-timestamp time 时间戳
-author string 作者
-copyright string 版权信息
-comment string 评论
-album string album名
-v verbose 与log相关的
-target type 设置目标文件类型("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...)
-dframes number 设置要记录的帧数
视频选项:
-b 指定比特率(bits/s),似乎ffmpeg是自动VBR的,指定了就大概是平均比特率
-vb 指定视频比特率(bits/s)
-vframes number 设置转换多少桢(frame)的视频
-r rate 桢速率(fps)
-s size 分辨率
-aspect aspect 设置视频长宽比(4:3, 16:9 or 1.3333, 1.7777)
-croptop size 设置顶部切除尺寸(in pixels)
-cropbottom size 设置底部切除尺寸(in pixels)
-cropleft size 设置左切除尺寸 (in pixels)
-cropright size 设置右切除尺寸 (in pixels)
-padtop size 设置顶部补齐尺寸(in pixels)
-padbottom size 底补齐(in pixels)
-padleft size 左补齐(in pixels)
-padright size 右补齐(in pixels)
-padcolor color 补齐带颜色(000000-FFFFFF)
-vn 取消视频
-vcodec codec 强制使用codec编解码方式('copy' to copy stream)
-sameq 使用同样视频质量作为源(VBR)
-pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
-passlogfile file 选择两遍的纪录文件名为file
-newvideo 在现在的视频流后面加入新的视频流
高级视频选项
-pix_fmt format set pixel format, 'list' as argument shows all the pixel formats supported
-intra 仅适用帧内编码
-qscale q 以<数值>质量为基础的VBR,取值0.01-255,约小质量越好
-loop_input 设置输入流的循环数(目前只对图像有效)
-loop_output 设置输出视频的循环数,比如输出gif时设为0表示无限循环
-g int 设置图像组大小
-cutoff int 设置截止频率
-qmin int 设定最小质量
-qmax int 设定最大质量
-qdiff int 量化标度间最大偏差 (VBR)
-bf int 使用frames B 帧,支持mpeg1,mpeg2,mpeg4
音频选项:
-ab 设置比特率(单位:bit/s,也许老版是kb/s)
-aframes number 设置转换多少桢(frame)的音频
-aq quality 设置音频质量 (指定编码)
-ar rate 设置音频采样率 (单位:Hz)
-ac channels 设置声道数
-an 取消音频
-acodec codec 指定音频编码('copy' to copy stream)
-vol volume 设置录制音量大小(默认为256)
-newaudio 在现在的音频流后面加入新的音频流
字幕选项:
-sn 取消字幕
-scodec codec 设置字幕编码('copy' to copy stream)
-newsubtitle 在当前字幕后新增
-slang code 设置字幕所用的ISO 639编码(3个字母)
Audio/Video 抓取选项:
-vc channel 设置视频捕获通道(只对DV1394)
-tvstd standard 设置电视标准 NTSC PAL(SECAM)
二.Mencoder参数
-of lavf:是输出文件格式,这里不是flv而是lavf,是因为flv属于libavformat;
-oac oac=output audio codec 编码音频部分。这儿是mp3lame。
-oac mp3lame 音频采用mp3编码
-lameopts abr:br=56:
br是指设置音频比特率为56(比特率:每秒钟输出的音频大小,单位kb/s);
#-lameopts mode=3:cbr:br=32:vol=1,mode=3是音体声,mode=0单声道; vol=1-10控制音量
# -lameopts 顾名思义,即lame选项,这儿只需定义一下码率就可以了。
vbr 设定音频码率的方法
0 cbr average bitrate
1 mt
2 rh constant bitrate Also forces CBR mode encoding on subsequent ABR presets modes.
3 abr
4 mtrh
br 就是设定我们所需要的码率值,格式为br=<0-1024>,只能在vbr为0和3的情况下才能使用该选项。
-ovc lavc #ovc=output video codec ;
-ovc 编码文件的视频部分。主要有以下几个选项
-ovc copy 不进行编码,只是复制视频流
-ovc divx4 编码成DivX4/DivX5
-ovc raw 编码成任意不压缩的格式(用‘-vf format’设定具体的格式)
-ovc lavc 使用libavcodec进行编码
-lavcopts vcodec=flv:vbitrate=350:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1
# 对lavc进行一些设置,vcodec=flv:指定视频编码器为flv
# vbitrate=500:指定视频比特率为500(低品质为150kb/s,中等品质为400kb/s,高品质为700kb/s)
# mbd:宏模块选择算法,值为0~2默认为0,值越大转换越缓慢,但在品质和文件大小方面有好处;
# mv0:编译每个宏模块并选择最好的一个,当mbd=0时无效;
# v4mv:会稍微增加品质,mbd>0时效果更明显;
# trell:量子化网格搜索,对每8×8block找到最优化编码;
# cbp:只能和trell一期使用,评估失真的图像块编码;
# last_pred=3:与上一帧相比的移动数量预测,值为0~99,1~3比较合适,大于3时对品质的提高已经无关紧要,但却会降低速度;
# dia=4:移动搜索范围,值为-99~6,对于快速转换,-1是个不错的值,如果不是很重视速度,可以考虑2~4;
# cmp=6:值为1~2000,默认为0,设置用于全象素移动预算的比较函数
# vb_strategy=1:对动作很大的场景会有帮助,对有些视频,设置vmax_b_frames会有损品质,加上vb_strategy=1会好点。
-vf scale=512:-3 #5-vf表示视频格式,scale是缩放,512:-3表示强制将宽度设置为512,高度写为-3表示保持高宽比
-ofps 12 帧速率设置,现为12fps
-srate 22050 声音采样频率设置,现为22K
mencoder进行操作的常用方法: mencoder infile.* -o outfile.* [-ovc 目标视频格式] [-oac 目标音频格式] [-of 目标文件格式]
1.转换成flv文件: mencoder infile.* -o outfile.flv -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=150:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050
mencoder infile.rmvb -o outfile.flv -vf scale=-3:150 -ofps 12 -oac mp3lame -ovc xvid -xvidencopts bitrate=112
2.转换成avi文件: mencoder infile.* -o outfile.avi -of avi -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600
3.转换成wmv文件(复杂写法,其中高级参数可以省去): mencoder infile.* -o outfile.wmv -of lavf -ofps 25 -oac mp3lame -lameopts cbr:preset=128 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=768:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240 -srate 22050 -sws 9 -subcp cp936 -subpos 0 -subalign 0 -subfont-text-scale 3 -lavfopts i_certify_that_my_video_strea
其中-ovc,-oac和-of是必须的,-ovc是指定视频codec,指定了ovc之后通常带一个该codec的opt参数,-oac是指定音频codec,也会在其后带一个codec的opt参数.可以指定细节以决定视频音频质量和转换速率.具体的细节可以参看专业的技术文档.
RMVB转AVI
mencoder 1.rmvb -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600 -of avi -o rmvb.avi
RM转AVI
mencoder 1.rm -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600 -of avi -o rm.avi
MPEG转AVI
mencoder mp4.mpeg -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600 -of avi -o mp4.avi
MOV转AVI
mencoder qtime.mov -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600 -of avi -o qtime.avi
WMV转AVI 包括WMV7到WMV9,只实验到WMV9
mencoder m7.wmv -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600 -of avi -o m7.avi
RV转AVI
mencoder 1.rv -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600 -of avi -o rv.avi
题外:
一.在用了ffmept的时候如果是多个用户同时上传,要在同一时间返回给用户信息是不现实的,一般的大型视频网站有专门的转换
服务器,而不是在web发布的服务器上直接转换的,使用队列来实现,一次转一个,实现分布式处理,多服务器并行处理,系统的负载均衡处理
用户上传后,调用这个类,他就会扫描一遍数据库,发现没有转换的循环转换,把转换和网站脱离开来。
转换:
1.可以把全部未转换的select出来,然后用for(XXX)来循环这个数据集
2.用select top 1 加while来扫描...
第一种方法就安全一点,但在这个类(或者方法)执行(数据集取出来后)过程,再有用户上传,也不会被加入转换队列,需要等当前转
换队列完成后,再有用户上传,才会被加到转换队列...
第二种方法就比较危险一点,毕竟是用while,只要中间逻辑出现任何错误,就有可能出现死循环...但是用while和select top 1
的话,转换队列是非常灵活的...是取一条,转一个...也就是说,只要这个while没完成(就是说数据库中还有没被转换的,包括转换
开始后才增加的数据),他都会调出来加到队列转换...相对实时一点...
---------------------------------------------------------------------------------------------------------------
另一方法
-------------------------------------------------------------------------------------
实际上是利用.Net中的Process对象来实现的。
string str = @"d:\test.avi d:\test_allen.flv" ; RunFFMpeg(str);
//运行FFMpeg的视频解码, public void RunFFMpeg(string strCmd) { //创建并启动一个新进程 Process p = new Process(); //设置进程启动信息属性StartInfo,这是ProcessStartInfo类,包括了一些属性和方法: p.StartInfo.FileName = "ffmpeg.exe" ; //程序名 p.StartInfo.Arguments = " -i " + strCmd; //执行参数 p.Start(); } //运行Cmd.exe执行Dos 命令,并返回执行结果 public string RunCmd(string command) { //创建并启动一个对进程 Process p = new Process(); //Process类有一个StartInfo属性,这是ProcessStartInfo类,包括了一些属性和方法,例如: p.StartInfo.FileName = "cmd.exe" ; //程序名 p.StartInfo.Arguments = " /c " + command; //执行参数 p.StartInfo.UseShellExecute = false ; //关闭Shell的使用 p.StartInfo.RedirectStandardInput = true ; //重定向标准输入 p.StartInfo.RedirectStandardOutput = true ; //重定向标准输出 p.StartInfo.RedirectStandardError = true ; //重定向错误输出 p.StartInfo.CreateNoWindow = true ; //设置不显示窗口 p.Start(); //p.StandardInput.WriteLine(command); //也可以用這種方式輸入要執行的命令 //p.StandardInput.WriteLine("exit"); //不過要記得加上Exit要不然下一行程式執行的時候會當機 //必须创建可以自动转换完成以后,结束进程的代码 return p.StandardOutput.ReadToEnd(); //從輸出流取得命令執行結果 }
另一种方法: 用MEncoder转换视频文件为Flv
mencoder 转换视频注意事项
1、下载 mencoder.exe
和 mplayer.exe
2、将mencoder.exe
所在文件夹,加入环境变量Path里面 ,如C:\mplayer
3、微软键+R,输入cmd,命令行打入如下语法
mencoder d:\test.avi -o d:\testflv.flv -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=100:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=512:-3 -ofps 12 -srate 22050
语法说明:
mencoder d:\test.avi -o d:\testflv.flv //将D:\test.avi 输出到 d:\testflv.flv, 参数 -o 代表输出路径 -of lavf //参数 -of :输出文件的格式,flv文件是属于lavf格式 -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames //lavf格式的参数设置,对于转换flv格式,最好加上这个长句。意思是不用bframes。 -oac mp3lame //输出音频编码器,这里用的mp3lame -lameopts abr:br=56 //是专门针对mp3lame的参数设置,abr:br=56,是设置音频比特率为56 -ovc lavc //输出视频编码器
//视频编码器的设置:
-lavcopts vcodec=flv: //指定视频编码器为flv vbitrate=500: //指定视频比特率为500 ,低品质为150kb/s,中等品质为400kb/s,高品质为700kb/s mbd=2: //宏模块选择算法,值为0~2默认为0,值越大转换越缓慢,但在品质和文件大小方面有好处 mv0: //编译每个宏模块并选择最好的一个,当mbd=0时无效; trell: //会稍微增加品质,mbd>0时效果更明显; v4mv: //量子化网格搜索,对每8×8block找到最优化编码 cbp: //只能和trell一期使用,评估失真的图像块编码; last_pred=3: //与上一帧相比的移动数量预测,值为0~99,1~3比较合适,大于3时对品质的提高已经无关紧要,但却会降低速度; dia=4: //移动搜索范围,值为-99~6,对于快速转换,-1是个不错的值,如果不是很重视速度,可以考虑2~4; cmp=6: //值为1~2000,默认为0,设置用于全象素移动预算的比较函数 vb_strategy=1: //对动作很大的场景会有帮助,对有些视频,设置vmax_b_frames会有损品质,加上vb_strategy=1会好点。 //mencoder的参数 -vf scale=512:-3: //-vf表示视频格式scale是缩放,512:-3表示强制将宽度设置为512,高度写为-3表示保持高宽比,也可以设置为-1或-2, -ofps 12 /*输出视频的帧频,一般,用于flash播放的视频帧频高了没有意义,反而会增加视频文件大小,但如果ofps设置的不合适, 比如源视频帧频不是ofps的整数倍,可能会导致转换后的视频、音频不同步, 似乎可以将这一参数改为-noskip来解决这一问题;*/ -srate 22050: //音频采样率一般为22050或44100。
Mencoder中文参考手册地址
http://www.mplayerhq.hu/DOCS/HTML/zh_CN/
参数说明:
-srate 32000 : //声音采样率,22050hz -af channels=2:2:1:0:1:1 //右声道 -af channels=2:2:0:0:0:1 //左声道 -stereo 0 //立体声 -oac mp3lame : //输出音频使用mp3编码 -lameopts mode=2:cbr:br=32 : //码率br=32 kbit -ovc xvid -xvidencopts bitrate=200 : //以xvid方式编码,码率200kbps (经实验,目前divx比xvid要快,在使用vhq功能时会稍稍影响速度) -vf scale=480:-3 -sws 9 : //变换至480像素宽,高度按比例缩放 "C:\dance.avi" -o "C:\dance.XviD.avi" //源文件地址 -o到 输出文件地址 2> 2.txt : //编码日志记录地址
--------------------参数选择分析------------------------
18fps:这是以前通过多次测试得来的,一般电视剧和动画片15fps就够用了。如果场景变换不是很大,13fps就能保证播放流畅。降低fps值可以使压缩速度更快,对于电影,特别是动作片,要保证流畅无马赛克,就要提高fps,最大24就够了
选择18fps足以应付大部分,性价比高
音频采样率32KHz:从录音设备的得来的灵感(以下质量说明为比喻,前面的参数时原有的)
32KHz - 32Kbps - mono比电话音好些
44KHz - 64Kbps - J-Stereo 收音机质量
44KHz -128Kbps - J-Stereo 通行的MP3标准质量
44KHz -192Kbps - Stereo接近CD质量
经过多次试验(以上是区间范围,自己可以根据需要选择)
压片最省空间 - 使用32KHz - 32Kbps - mono,可以保证内容;
质量要求不高 - 可用32KHz - 128Kbps - mono 性价比比较高;
空间大高质量 - 44KHz -192Kbps - Stereo对大SD卡用户。
视频采样率bitrate=150:
80 - 最小空间占用率,质量最差 转换速度稍快 (与最低音频配合,大小可1min=1M)
122 - 对底配置机器的小卡用户性价比较高(换面变化快回有马赛克)
150 - 满足底配置机器对画质的基本要求(对非动作片比较完美)
248 - 大卡用户的经济选择 (质量较好)
350 - 大卡高配置的机器 (经济的体现机器优势)
更高- 用户自己试吧
总的来说,输出文件的大小受视频采样率、音频采样率影响效果显著,画面尺寸、fps值也影响大小。怎样设置参数要看你的个人实际需要与机器配置。
另外,还有很多不知道的参数,请大家找找看。
比如:pess2、pess3、动态FPS、屏幕截取、时间区间设置等
关于音量调节:
carlwang 写道:个人习惯是不用耳机的,天热带着不舒服,所以声音我一向偏大。
我的经验如果片源是DVDrip,一般在5以上,如果是rmvb一般2就够了,再大就有爆音了。
-oac mp3lame -lameopts mode=2:cbr:br=64:vol=2 大家来试试看吧
转换结束,会显示
这里边的内容,小括号里应该是转换的进度,中括号里的内容很重要,142表示视频比特率,56表示音频比特率(比特率这个词不知道用的对不对......)
转换结束,会显示2行文字:
Video stream: 142.564 kbit/s (17820 B/s) size: 4046677 bytes 227.080 secs 2700 frames
Audio stream: 56.938 kbit/s (7117 B/s) size: 1616197 bytes 227.082 secs
这2行信息我想大家都能明白,其中我一直关注的是那个142.564kbit/s,
用过flash8自带转换工具的应该知道高级设置里有个选项是最大数据速率,
当选中中等画质的时候,是400kb/s,而低品质也是150kb/s,也就是说,用那句命令转换的视频,其画质都不如品质的,那么,品质怎么样呢?
看一下命令:
分析:
-ovc > 大概是output video codec的缩写,制定输出视频编码,选用的lavc,什么意思?说是用了libavcodec的编码器;
-lavcopts > 是lavc的options选项设置
要设置视频编码的参数了!
codec=flv > 说的是用的flv编码器,这个咱不理;
vbitrate=150 > video bit rate!视频数据速率!就是它了!原来我设的是150啊!
改成vbitrate=1000,再试试看!
结果,和前一次一模一样......
冷静下来,去往上看了一下官方文档,这个参数是最大数据速率,最大嘛,你设多大都一样啊,看来不是靠它来控制品质。
结论,设置品质有2种途径:
1、设置-lavcopts,看这样一句命令:
在-lavcopts里dia=4:cmp=6:vb_strategy=1这3条
dia越大品质越高,如果需要快速编码,设置为-1,设为4时已经很有利于品质了;
cmp越大品质越高,默认值0,是最快速的,一般设到3,设为6已经只会细微提高品质了,但速度会慢
vb_strategy,大概是1或者0,默认值可能为0,我这里设为1,会对编码有帮助,这个参数我自己没有过多推敲,可能并不影响品质......
2、加-sws选项,看下面的命令:
只是加一个3进去,转换后的效果和前面一种方法大致相同,视频数据速率都是422.5kb/s左右,解释一下
-sws就是用来设置品质的,默认值为2,那么,为什么不用这种简单的方式呢?我个人认为,用前面一种方法有利于找到一个速度和品质的平衡点,毕竟变化的范围比较大。
个人见解:
如此视频格式的转换,最好使用客户端转换,转换好了再传到服务端,因此需要做客户端的一个视频上传小软件