zoukankan      html  css  js  c++  java
  • ASP在线转flv+所略图+flash在线录制视频

    Mencoder简介:

         Mencoder是Mplayer自带的编码工具(Mplayer是Linux下的播放器,开源,支持几乎所有视频格式的播放,现在有windows和Mac版本)。

    Mplayer的获得与配置:

         Mplayer windows版本下载列表:http://www5.mplayerhq.hu/MPlayer/releases/win32/
    列表中会有版本发布日期,可以挑选最新的版本,也可以选择old/去下载老的版本,笔者用的是6月份的版本。下载后解压到某个文件夹中即可。

         Codecs下载列表:http://www5.mplayerhq.hu/MPlayer/releases/codecs/
    选择windows-all-********.zip(*表示年月日)下载,将zip包中的文件夹下所有文件,包括*.dll、*.acm、*.ax等等全部copy到Mplayer根目录下的codecs文件夹中。

         此时最好把Mplayer.exe所在路径,同时也是Mencoder.exe所在路径添加到环境变量path中。

        现在可以试试用Mplayer播放视频,比如有个视频位于D:\music\APerfectMatch.wmv,那么可以打开一个cmd窗口,输入mplayer “D:\music\APerfectMatch.wmv”,感受一下来自Linux的播放器吧,可以通过键盘来操纵。

    Mencoder转换视频格式:

         以将各种格式转换为flv格式为例(flv格式是flash支持的视频格式):

    mencoder ””E:\test.m2p”” -o ””E:\output.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=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=512:-3 -ofps 12 -srate 22050

         在命令行中输入这行代码(注意:windows的命令行是不支持换行的),按回车运行,一段时间之后就可以得到一个.flv文件,播放一下看看品质如何(可以直接用Mplayer播放)。

         下图是我这边转换的效果对比,左边是原视频,右边是转换后的视频:


         所有人都会觉得,转换后品质下降了很多,确实是这样,同时可以发现转换后的文件由原来的13M变成了1M,如果要提高品质,可以将vbitrate=500改为vbitrate=5000。

         转换后的效果对比,左边是原视频,右边是转换后的视频:

         品质几乎一样了,但同时,转换文件变成了6M。

         关于命令中的一些参数,解释一下:

    -o ””E:\output.flv””:是输出文件路径;

    -of lavf:是输出文件格式,这里不是flv而是lavf,是因为flv属于libavformat;

    -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames:-lavfopts表示对lavf进行一些设置,设置的内容就是i_certify_that_my_video_stream_does_not_use_b_frames,翻译成中文就是:我确定,我的视频不用B frames,对于转换flv格式,最好加上这个参数,否则可能会报错,如图:

    -oac mp3lame:oac=output audio codec,输出音频编码器,这里用的mp3lame;

    -lameopts abr:br=56:lame options,是专门针对mp3lame的参数设置,abr:br=56,是设置音频比特率为56(比特率:每秒钟输出的音频大小,单位kb/s);

    -ovc lavc:ovc=output video codec,输出视频编码器,lavc表示one of libavcodec’s video codec,输出格式为libavformat之一,编码器当然也是libavcodec之一啦,至于libavodec里都有哪些编码器,可以查看Mplayer的官方文档;

    -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:v4mv:trell:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1:对lavc进行一些设置,详细介绍如下:
    vcodec=flv:指定视频编码器为flv;
    vbitrate=500:指定视频比特率为500,这个参数很重要,vbitrate大了可以让视频品质增加,但会让文件变的很大(可以参考flash8自带的转换工具的参数:低品质为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会好点。

         以上是对-lavcopts的详细解释,接下来继续说明mencoder的参数:

    -vf scale=512:-3:-vf表示视频格式,scale是缩放,512:-3表示强制将宽度设置为512,高度写为-3表示保持高宽比,也可以设置为-1或-2,具体表示什么,有兴趣的可以尝试一下。如果要强制转化为统一大小,可以直接写-vf scale=640:480,但笔者个人建议用-3来保持高宽比。-vf里还有expand和crop参数,例如:-vf scale=512:384,expand=512:384:::1,crop=512:384:0:0,expand表示膨胀,crop表示裁剪;

    -ofps 12:输出视频的帧频,一般,用于flash播放的视频帧频高了没有没有意义,反而会增加视频文件大小,但如果ofps设置的不合适,比如源视频帧频不是ofps的整数倍,可能会导致转换后的视频、音频不同步,似乎可以将这一参数改为-noskip来解决这一问题;

    -srate 22050:音频采样率一般为22050或44100。

         对于转换flv格式,lavsopts的设置比较重要,还有很多参数本文没有涉及到,在笔者参考的文献中会有具体的说明,感兴趣的可以去看一下。我对于Mencoder的认识主要也是来源于下面2篇文章,实践的比较少,如果有理解和翻译的失误,再次欢迎与我交流。


    参考文献:

    《Mplayer官方文档,英文版》http://www.mplayerhq.hu/DOCS/HTML-single/en/MPlayer.html
    《Linux Reviews》http://linuxreviews.org/man/mencoder/

    关于用mencoder将各种格式转换为flv格式,网络上应该也有一些文章,我把最近学习的心得和大家分享一下.
    如果您正准备开始使用mencoder,似乎也可以当作教程来看,如果您有更好的方法或技术,请不吝赐教!
    mencoder,可以从其官方网站上获得:
    http://www.mplayerhq.hu
    下载完之后,修改一下环境变量,将mencoder.exe及mplayer.exe文件所在的目录添加到path变量里。
    mencoder是在命令行中执行的(官网上的文档里的实例似乎都是linux下的)
    我是计算机小白,当然只会使用windows……
    开始菜单 -> 运行 -> cmd -> 回车,就打开了命令行窗口
    这时,我们可以拿一个视频来试试看,我用的是一个mtv,wmv格式的,文件名:APerfectMatch.wmv。
    在命令行中输入:(注意,不要从网页上直接copy这段命令到cmd,windows的命令行似乎是不支持换行的......)
    mencoder "D:\music\sk8ter_boi_300.wmv" -o "D:\output.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 不是内部或外部命令,也不是可运行的程序,或批处理文件”,那么说明环境变量没有设置好
    如果正常,会看到开始转视频,会看到一排一排的字往上翻,内容大概是这样:
    Pos: 226.8s 297f (100%) 48fps Trem: 0min 5mb a-v:-0.009 [142:56]
    这里边的内容,我最关注的是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,也就是说,用那句命令转换的视频,其画质都不如品质的,那么,品质怎么样呢?看一下,怎么看flv文件?别忘了我们有万能播放器mplayer,哈哈,直接在命令行里输入:
    mplayer "d:\output.flv",看到咱们刚刚转好的视频,我当时一看,画面上马赛克倒是没有,全是瓷砖,我晕倒...
    进入正题了,怎么来提高画面品质?(晕倒,原来前面都不是正题...=_=o)
    回头看一下我们的命令行:
    mencoder "D:\music\sk8ter_boi_300.wmv" -o "D:\output.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 说明你用的是mencoder;
    "d:\.....wmv" -> 是指你的输入视频;
    -o -> 后面指定输出路径;(前面有“-”的都是option(选项的意思))
    -of -> 大概是output format的缩写,输出文件格式,咦!为什么不是flv,而是lavf?lavf表示你使用了libavcodec里的格式,flv正好是libavcodec里的,呵呵;
    -oac -> 大概是output audio codec的缩写,指定输出音频编码,这儿选用的是mp3lame;
    -lameopts -> 指定lame的options,就是设置音频输出的一些参数啦,我只关心视频,跳过
    -ovc -> 大概是output video codec的缩写,制定输出视频编码(我最关心的好像要上场了),选用的lavc,什么意思?说是用了libavcodec的编码器;
    -lavcopts -> 是lavc的options,要设置视频编码的参数了!(心跳加速,血压升高,口中开始大量分泌唾液),看看它后面都有什么:
    codec=flv 说的是用的flv编码器,这个咱不理;
    vbitrate=150 video bit rate!视频数据速率!就是它了!原来我设的是150啊!
    找到了,下面不看了!改成vbitrate=1000,再试试看!
    结果,和前一次一模一样......(我还改成10000的,真的,还是一样,我当时以为它的单位是b/s而不是kb/s)
    冷静下来,去往上看了一下官方文档,这个参数是最大数据速率,最大嘛,你设多大都一样啊,看来不是靠它来控制品质。
    不卖关子了,直接给出我的结论吧,设置品质有2种途径:
    1、设置-lavcopts,看这样一句命令:
    mencoder "D:\music\APerfectMatch.wmv" -o "D:\output.flv" -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=320:240,expand=320:240:::1,crop=320:240:0:0 -ofps 30 -srate 22050
    看看多了什么?
    在-lavcopts里多了dia=4:cmp=6:vb_strategy=1这3条
    他们的含义我只是大概了解一点点,毕竟不是专业搞视频编码的
    dia越大品质越高,如果需要快速编码,设置为-1,设为4时已经很有利于品质了;
    cmp越大品质越高,默认值0,是最快速的,一般设到3,设为6已经只会细微提高品质了,但速度会慢
    vb_strategy,大概是1或者0,默认值可能为0,我这里设为1,会对编码有帮助,这个参数我自己没有过多推敲,可能并不影响品质......
    2、加-sws选项,看下面的命令:
    mencoder "D:\music\APerfectMatch.wmv" -o "D:\output.flv" -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -sws 3 -vf scale=320:240,expand=320:240:::1,crop=320:240:0:0 -ofps 30 -srate 22050
    只是加一个 -sws 3进去,转换后的效果和前面一种方法大致相同,视频数据速率都是422.5kb/s左右,解释一下
    -sws就是用来设置品质的,默认值为2,那么,为什么不用这种简单的方式呢?我个人认为,用前面一种方法有利于找到一个速度和品质的平衡点,毕竟变化的范围比较大。
    其他一些选项,我也没有深入研究。

    需要用到的组件
    ASPExec
    mencoder
    ffmpeg.exe

    第一步骤: 在线转换

    Set Executor = Server.CreateObject("ASPExec.Execute")
    Executor.Application = "cmd /c mencoder E:\qiancheng\upload\"&request.QueryString("keys")&" -o E:\qiancheng\shipin\record\streams\_definst_\record\"&lid&"\"&keys&".flv -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -lavcopts vcodec=flv:vbitrate=200:mbd=2:mv0:v4mv:last_pred=3:dia=3:cmp=3:vb_strategy=1 -vf scale=330:-3 -ofps 12 -srate 22050"
    Executor.Parameters = ""
    strResult = Executor.ExecuteDosApp

    asp执行 .bat文件

    第二步骤: 通过ffmpeg生成所略图+fso 删除源件

    Server.ScriptTimeout=0
    flvname=keys
    streamPath="../shipin/record/streams/_definst_/record/"&lid&"/"&flvname&".flv"
    imgW ="120"
    imgY = "90"
    imgQuality = "100"
    ss="3"
    newName = "../upload/"&flvname&".jpg"
    str="e:\qiancheng\webadmin\ffmpeg.exe"
    str=str+" -i "&server.mappath(streamPath)&" -ss 3 -vframes 1 -r 1 -ac 1 -ab 2 -s 120*90 -f image2 "&server.mappath(newName)&""
    Set shellffmpeg=server.CreateObject("ffmpeg.shellffmpeg")
    aa=shellffmpeg.shellffmpeg1(str)
    Set shellffmpeg = Nothing
    ””删除上传的文件
    tupianid="../upload/"&request.QueryString("keys")
    set   fso=server.CreateObject("scripting.filesystemobject")   
    if fso.FileExists(Server.MapPath(tupianid))   then   
    fso.deletefile(server.MapPath(tupianid))   
    end if   
    set fso=nothing

    flash视频整站程序制作完成, 在线录制视频+音频+ 缩略图+在线转flv +asp + sqlserver

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    AtCoder Beginner Contest 205
    Codeforces Round #725 (Div. 3)
    Educational Codeforces Round 110 (Rated for Div. 2)【A
    Codeforces Round #722 (Div. 2)
    AtCoder Beginner Contest 203(Sponsored by Panasonic)
    AISing Programming Contest 2021(AtCoder Beginner Contest 202)
    PTA 520 钻石争霸赛 2021
    Educational Codeforces Round 109 (Rated for Div. 2)【ABCD】
    AtCoder Beginner Contest 200 E
    Educational Codeforces Round 108 (Rated for Div. 2)【ABCD】
  • 原文地址:https://www.cnblogs.com/Athrun/p/1031000.html
Copyright © 2011-2022 走看看