搭建一个Flv视频播放服务器
经过一天的努力,查了好多资料,终于搞定了Flv视频服务器。本来这个事情没那么复杂的,无奈网上的很多资料都是错漏百出,内容脱节的,包括一些官方站也是,实在让人郁闷不已。为了让大家能避免被错误的文档误导,写个简短文章给大家做参考。
目前,由于Flash的流行,网络上绝大多数的微视频网站都采用了Flv格式来播放视频。
在互联网上播放视频,有两种方式,一种是文件方式,即通过HTTP协议访问视频文件,这种方式的缺点是不能从特定的帧开始播放;另外一种就是采用专 门的流媒体服务器,这种方式的缺点是要搭建复杂的流媒体服务器。不过,现在有了一种集合了以上两种方式优点的一种解决方案,即通过HTTP来实现伪流媒 体。本文描述的就是这样的一种解决方案。
Flv播放器
首先,你需要有一个能够播放Flv视频的播放器,很显然,它还需要能够嵌入到网页中。目前比较流行的,功能上也还比较完善的一个Flv播放器就是 JW FLV Media Player(也称为 jwplayer)。它的网址是:
本文写作时,jwplayer的最新版本是4.6。它对于非商业使用是免费。
从上述网址下载jwplayer,输入邮件地址即可下载一个压缩包。
可以考虑下载使用带有 Viral 插件的版本,Viral插件会在视频播放完后,弹出一个窗口,可供浏览者将该视频嵌入到其他网页、发布该视频的URL和推荐该视频,对于推广视频比较有用。
将包中的player.swf(如果是带有Viral插件的,就是player-viral.swf)放到你的网站内,这就是用来提供视频播放的播放器。至于包中其它的文件,都可以不要。
接下来,将播放器嵌入到你的视频播放网页中。嵌入的方式有两种:
直接嵌入,使用Object/Embed代码嵌入:
01.
<
object
id
=
"player1"
classid
=
"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
name
=
"player1"
width
=
"328"
height
=
"200"
>
02.
<
param
name
=
"movie"
value
=
"player.swf"
/>
03.
<
param
name
=
"allowfullscreen"
value
=
"true"
/>
04.
<
param
name
=
"allowscriptaccess"
value
=
"always"
/>
05.
<
param
name
=
"flashvars"
value
=
"file=video.flvℑ=preview.jpg&autostart=false&type=http&streamer=start"
/>
06.
<
embed
07.
type
=
"application/x-shockwave-flash"
08.
id
=
"player2"
09.
name
=
"player2"
10.
src
=
"player.swf"
11.
width
=
"328"
12.
height
=
"200"
13.
allowscriptaccess
=
"always"
14.
allowfullscreen
=
"true"
15.
flashvars
=
"file=video.flvℑ=preview.jpg&autostart=false&type=http&streamer=start"
16.
/>
17.
</
object
>
上面代码中,你需要将video.flv和preview.jpg替换成你的视频文件及其预览图。
基本上这种直接代码嵌入的方式在各种浏览器中都是兼容的。但是,以上代码在IE7+的某些安全设置下,播放Flash时会弹出安全提示,需要手动许可。所以,还有一种更好方式来嵌入,
使用swfobject来嵌入Flash:
swfobject是一个很小的JavaScript脚本(10k),该脚本引入了一个swfobject对象,用于在网页内嵌入Flash,并避免了上述的安全提示。swfobject已经得到了广泛的使用和好评。
swfobject在jwplayer包中也包含了一个,不过是很旧的1.5版,建议使用最新的版本。本文写作时,最新的版本是2.2。swfobject可以从此下载(只需要其中的swfobject.js文件):
使用swfobject嵌入的代码如下:
01.
<
html
>
02.
<
script
type
=
"text/JavaScript"
src
=
"swfobject.js"
></
script
>
03.
<
head
>
04.
<
script
type
=
"text/JavaScript"
>
05.
06.
/*
<![CDATA[ */
07.
function createPlayer() {
08.
var flashvars = {
09.
file:"video.flv",
10.
type:"http",
11.
image:"preview.jpg",
12.
autostart:"false",
13.
streamer:"start"
14.
}
15.
var params = {
16.
allowfullscreen:"true",
17.
allowscriptaccess:"always"
18.
}
19.
var attributes = {
20.
id:"player1",
21.
name:"player1"
22.
}
23.
swfobject.embedSWF("player.swf", "placeholder1", "320", "196", "9.0.115", false, flashvars, params, attributes);
24.
}
25.
/* ]]>
*/
26.
</
script
>
27.
28.
</
head
>
29.
<
body
onload
=
"createPlayer();"
>
30.
<
div
id
=
"placeholder1"
></
div
>
31.
</
body
>
32.
</
html
>
上述代码中,首先引入swfobject.js,然后将实例化播放器的代码放到head中;在body内放一个空的div用来为播放器占位,该div的 ID(上例中是placeholder1)会被传递给swfobject.embedSWF()函数,swfobject会在该div内生成播放器;最后 在body的onload事件中进行播放器的创建。
在上述的两种代码中,有两个关键点:
- flashvars中的type参数的值应为“http”,这表明了该视频是通过http方式访问的。
- falshvars中的streamer参数的值应为“start”,这个参数用于传递给服务器从特定的(关键)帧开始播放,没有这个参数,视频就不能拖到特定点播放。(lighttpd和nginx的Flv模块都支持这个start参数)
此外,需要注意的是,如果一个Flv视频要能够被拖到特定点播放,该Flv需要在其metadata中有关键帧的信息。如果你的Flv视频制作的时 候没有这些信息,也是不能拖放播放的。可以使用flvmdi来为你的视频加上关键帧信息,这是一个windows下的小程序,从此下载:
完成了以上工作,那么客户端的播放器的显示就可以工作了。接下来我们搭建用来提供Flv文件访问的HTTPD服务器。
Flv视频服务器
搭建Flv视频服务器,建议采用轻量级的HTTP服务器,毕竟Flv文件只是静态文件。轻量级的HTTP服务器有两种选择:lighttpd和nginx。选择任何一个都可以,在提供Flv服务方面,两者相差不多。
nginx
从nginx的网站下载最新的稳定版,本文写作时的最新稳定版的版本是0.7.63:
下载后进行编译,要将“ --with-http_flv_module ” 加上,这个是用来专门提供Flv服务的模块。nginx的编译的其他选项及配置这里就不多说了,只说明一下在配置中如何激活flv模块:
在server配置中,加入如下语句,表明所有的flv文件由flv模块进行处理:
1.
location ~ \.flv { flv; }
lighttpd
从lighttpd下载最新的稳定版,本文写作时的最新稳定版的版本是1.4.24:
下载后编译不需要特定选项,flv模块是默认编译进去的,但是在配置文件中并无此模块,需要手动添加:
在server.modules区块中加入如下语句来激活flv模块(如果不是插入到最后一行,记得末尾的逗号):
1.
"mod_flv_streaming",
然后在配置文件中增加如下行来说明所有的Flv文件都由flv模块处理:
1.
flv-streaming.extensions = ( ".flv" )
说明:在以上两种HTTP服务器中,flv模块实际上会接收通过拖放播出而传递的类似 “?start=1030435” 这样的参数,并根据该参数传递从特定位置开始的视频数据。
这样,Flv视频服务器就安装好了。你可以试试播放Flv视频,也可以看看拖放是否工作。
如果你需要播放mp4视频,基本原理如上,只是需要额外的处理mp4文件的模块,在此就不赘述了。