在ASP.Net中实现flv视频转换的代码

实际上是利用.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 大家来试试看吧

------------------------------------------------------------------------

转换结束,会显示 
Pos: 226.8s 297f (100%) 48fps Trem: 0min 5mb a-v:-0.009 [142:56] 
这里边的内容,小括号里应该是转换的进度,中括号里的内容很重要,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,也就是说,用那句命令转换的视频,其画质都不如品质的,那么,品质怎么样呢?

看一下命令: 
mencoder "D:\music.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

分析: 
-ovc > 大概是output video codec的缩写,制定输出视频编码,选用的lavc,什么意思?说是用了libavcodec的编码器;

-lavcopts > 是lavc的options选项设置

要设置视频编码的参数了! 
codec=flv > 说的是用的flv编码器,这个咱不理; 
vbitrate=150 > video bit rate!视频数据速率!就是它了!原来我设的是150啊!

改成vbitrate=1000,再试试看! 
结果,和前一次一模一样......

冷静下来,去往上看了一下官方文档,这个参数是最大数据速率,最大嘛,你设多大都一样啊,看来不是靠它来控制品质。

结论,设置品质有2种途径: 
1、设置-lavcopts,看这样一句命令: 
-lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1

在-lavcopts里dia=4:cmp=6:vb_strategy=1这3条 
dia越大品质越高,如果需要快速编码,设置为-1,设为4时已经很有利于品质了; 
cmp越大品质越高,默认值0,是最快速的,一般设到3,设为6已经只会细微提高品质了,但速度会慢 
vb_strategy,大概是1或者0,默认值可能为0,我这里设为1,会对编码有帮助,这个参数我自己没有过多推敲,可能并不影响品质......

2、加-sws选项,看下面的命令: 
-sws 3 
只是加一个3进去,转换后的效果和前面一种方法大致相同,视频数据速率都是422.5kb/s左右,解释一下 
-sws就是用来设置品质的,默认值为2,那么,为什么不用这种简单的方式呢?我个人认为,用前面一种方法有利于找到一个速度和品质的平衡点,毕竟变化的范围比较大。

个人见解:
如此视频格式的转换,最好使用客户端转换,转换好了再传到服务端,因此需要做客户端的一个视频上传小软件

(0)

相关推荐

  • 在ASP.Net中实现flv视频转换的代码

    实际上是利用.Net中的Process对象来实现的.    string str=@"d:\test.avi  d:\test_allen.flv";    RunFFMpeg(str); //运行FFMpeg的视频解码,    public void RunFFMpeg(string strCmd)    {        //创建并启动一个新进程        Process p = new Process();        //设置进程启动信息属性StartInfo,这是Pro

  • ASP.NET中画图形验证码的实现代码

    本文给大家分享一段asp.net代码实现画图形验证码功能,代码简单易懂,具体代码如下所示: context.Response.ContentType = "image/jpeg"; //生成随机的中文验证码 string yzm = "人口手大小多少上中下男女天地会反清复明杨中科小宝双儿命名空间语现在明天来多个的我山东河北南固安北京南昌东海西安是沙河高教园学" + "木禾上下土个八入大天人火文六七儿九无口日中了子门月不开四五目耳头米见白田电也长山出飞马鸟云

  • html中嵌入flv格式文件的代码

    复制代码 代码如下: <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" height="120" width="190"> <param name=

  • asp.net中3种验证码示例(实现代码)(数字,数字字母混和,汉字)

    效果如图所示: Default.aspx 复制代码 代码如下: <table> <tr> <td class="style1">  (验证码测试)</td> <td>   <asp:Label ID="Label1" runat="server"></asp:Label>   <asp:Image ID="Image1" runat=&q

  • asp.net中控制反转的理解(文字+代码)

    对IOC的解释为:"Inversion of control is a common characteristic of frameworks, so saying that these lightweight containers are special because they use inversion of control is like saying my car is special because it has wheels." 我想对这一概念执行 一个个人的阐述,以方便

  • ASP.NET中常用的三十三种代码第1/7页

    1. 打开新的窗口并传送参数: 传送参数:  response.write("<script>window.open('*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"')</script>")  接收参数:  string a = Request.QueryString("id");  string b = Request.Que

  • asp.net中动态改变网页标题的代码

    方法1. 首先:在.aspx页: <HEAD> <title> <%=PageTitle %> </title> ....... </HEAD> 其次:在.aspx.cs页: public class news_view : System.Web.UI.Page { ............ //用于动态设置页面标题 protected string PageTitle; .... private void Page_Load(object se

  • 在Asp.net中使用JQuery插件之jTip代码

    默认支持两个参数: width宽度,default value :250px link 要link的URL对应的Source code是: 复制代码 代码如下: var params = parseQuery( queryString ); if(params['width'] === undefined){params['width'] = 250}; if(params['link'] !== undefined){ $('#' + linkId).bind('click',function

  • 在asp.NET 中使用SMTP发送邮件的实现代码

    核心代码: 复制代码 代码如下: public class Mail { #region 邮件参数 static public string accountName = System.Configuration.ConfigurationManager.AppSettings["SmtpAccountName"]; static public string password = System.Configuration.ConfigurationManager.AppSettings[

  • asp.net中WebResponse 跨域访问实例代码

    前两天,一个朋友让我帮他写这样一个程序:在asp.net里面访问asp的页面,把数据提交对方的数据库后,根据返回的值(返回值为:OK或ERROR),如果为OK再把填入本地数据库.当时,想当然,觉得很简单,用js的xmlhttp ,如果根据response 的值是"OK"就执行提交本地数据库.很快写完发过去,让朋友试试,一试发现不行,后来一问,原来是跨域访问,我给忽略了,于是让朋友把asp改成web service,可朋友说程序是合作公司做的,只会asp,不会用web service ,

随机推荐