FLV在ASP.NET中播放的实现方案

FLV Flash video streaming with ASP.NET 2.0, IIS and HTTP handler

在Asp.net2.0中配置IIS的HTTP handler来实现

Using this HTTP handler you can easily FLV streaming downloads just like video.google.com does. All you need is to install on your IIS 5.0/6.0 the following HTTP handler and to get this to work correctly, you will need to make sure that IIS handles request for .flv files. In your site's properties, click the "Home directory tab" and click the "Configuration" button. You'll get a form like this(translated by 51aspx.com):

通过httphandler你可以很容易的下载Flv的流媒体视频,就像video.google.com一样。你所需要的是通过安装IIS然后配置扩展名的映射即可。在站点-》属性-》主目录-》配置 然后添加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,命令行打入如下语法

CODE:

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

语法说明:

CODE:

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/

参数说明:

CODE:

-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,也就是说,用那句命令转换的视频,其画质都不如品质的,那么,品质怎么样呢?

看一下命令:

CODE:

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,那么,为什么不用这种简单的方式呢?我个人认为,用前面一种方法有利于找到一个速度和品质的平衡点,毕竟变化的范围比较大。

个人见解:

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

 

创建一个全功能的FLV播放器

我们将制作的这个FLV播放器由这样几部分组成:

一个用于显示视频图像的视频对象,

三个分别用于播放、暂停和停止视频的按钮,

以及一个用于显示缓冲区装载进度的动态文本。

1. 创建三个按钮元件,分别命名为“播放”、“暂停”、“停止”,将其各自一个实例拖放到场景舞台中。

2. 创建一个视频元件,将其一个实例拖放到场景舞台中,并赋予其实例名myVideo。

3. 在场景舞台中放置一个动态文本,赋予其实例名myText。

4. 在根时间线的第1帧中捆绑下面的脚本:

CODE:

//创建一个NetConnection对象。

myFLVConnection=new NetConnection();

//创建一个流连接。

myFLVConnection.connect(null);

//创建一个NetStream对象。

//myFLVConnection被指定给该NetStream对象。

myFLVStream=new NetStream(myFLVConnection);

//myFLVStream被捆绑到Video对象myVideo:

myVideo.attachVideo(myFLVStream);

//设置缓冲时间。

myFLVStream.setBufferTime(10);

分析这段脚本,首先我创建了一个NetConnection对象myFLVConnection,然后我调用NetConnection对象的connect()方法打开了一个流连接,在调用connect()方法时你必须传递给它一个null值作为参数。

接下来,我利用myFLVStream=new NetStream(myFLVConnection);这行代码创建了一个NetStream对象myFLVStream,在创建时我就需要把为该“流”提供的“连接”告知它,即把myFLVConnection对象作为参数传递给NetStream类的构造函数。

之后,我把myFLVStream(“流”)捆绑到Video对象myVideo。然后,我还用NetStream类的setBufferTime()方法以秒为单位指定了一个缓冲时间,即要在缓冲区中装入可供播放多长时间的数据后才开始播放。

5. 在“播放”按钮实例上捆绑下面的脚本:

on(release){

//装载并播放FLV文件。

myFLVStream.play("myFLV.flv");

//定义bufferLoad函数以供setInterval函数调用来显示缓冲进度。

function bufferLoad(){

//在动态文本中显示缓冲区的装载进度。

myText.text="缓冲区已装载"+int((myFLVStream.bytesLoaded/myFLVStream.bytesTotal)*100)+"%";

}

//设置时间间隔。

setInterval(bufferLoad,20);

}

这行代码—myFLVStream.play("myFLV.flv");用来装载和播放FLV文件。如果你的FLV文件位于某个HTTP地址或本地文件系统的某处,你可以使用http://或file://这样的格式作为路径?..FLV文件的位置。

这个表达式—myFLVStream.bytesLoaded/myFLVStream.bytesTotal用来检查缓冲区已装载的字节占缓冲区要装载的总字节的比值。bytesLoaded和bytesTotal是NetStream类的两个属性。

6. 在“暂停”按钮实例上捆绑下面的脚本:

on(release){

//暂停FLV文件。

myFLVStream.pause();

}

7. 在“停止”按钮实例上捆绑下面的脚本:51aspx。com

on(release){

//停止FLV文件并同时删除下载的FLV文件。

myFLVStream.close();

}

8. 制作完成。你应该在你的网站中测试这个FLV播放器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值