搭建一个Flv视频播放服务器

热度 15已有 11511 次阅读2009-11-2 22:27 |关键词:服务器 视频 flv 播放 文档 错漏

经过一天的努力,查了好多资料,终于搞定了Flv视频服务器。本来这个事情没那么复杂的,无奈网上的很多资料都是错漏百出,内容脱节的,包括一些官方站也是,实在让人郁闷不已。为了让大家能避免被错误的文档误导,写个简短文章给大家做参考。

目前,由于Flash的流行,网络上绝大多数的微视频网站都采用了Flv格式来播放视频。

在互联网上播放视频,有两种方式,一种是文件方式,即通过HTTP协议访问视频文件,这种方式的缺点是不能从特定的帧开始播放;另外一种就是采用专门的流媒体服务器,这种方式的缺点是要搭建复杂的流媒体服务器。不过,现在有了一种集合了以上两种方式优点的一种解决方案,即通过HTTP来实现伪流媒体。本文描述的就是这样的一种解决方案。

Flv播放器

首先,你需要有一个能够播放Flv视频的播放器,很显然,它还需要能够嵌入到网页中。目前比较流行的,功能上也还比较完善的一个Flv播放器就是 JW FLV Media Player(也称为 jwplayer)。它的网址是:

http://www.longtailvideo.com/players/jw-flv-player/

本文写作时,jwplayer的最新版本是4.6。它对于非商业使用是免费。

从上述网址下载jwplayer,输入邮件地址即可下载一个压缩包。

可以考虑下载使用带有 Viral 插件的版本,Viral插件会在视频播放完后,弹出一个窗口,可供浏览者将该视频嵌入到其他网页、发布该视频的URL和推荐该视频,对于推广视频比较有用。

将包中的player.swf(如果是带有Viral插件的,就是player-viral.swf)放到你的网站内,这就是用来提供视频播放的播放器。至于包中其它的文件,都可以不要。

接下来,将播放器嵌入到你的视频播放网页中。嵌入的方式有两种:

直接嵌入,使用Object/Embed代码嵌入

·········10········20········30········40········50········60········
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文件):

http://code.google.com/p/swfobject/

使用swfobject嵌入的代码如下:

·········10········20········30········40········50········60········
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下的小程序,从此下载:

http://www.buraks.com/flvmdi/

完成了以上工作,那么客户端的播放器的显示就可以工作了。接下来我们搭建用来提供Flv文件访问的HTTPD服务器。

Flv视频服务器

搭建Flv视频服务器,建议采用轻量级的HTTP服务器,毕竟Flv文件只是静态文件。轻量级的HTTP服务器有两种选择:lighttpd和nginx。选择任何一个都可以,在提供Flv服务方面,两者相差不多。

nginx

从nginx的网站下载最新的稳定版,本文写作时的最新稳定版的版本是0.7.63:

http://nginx.net/

下载后进行编译,要将“ --with-http_flv_module ” 加上,这个是用来专门提供Flv服务的模块。nginx的编译的其他选项及配置这里就不多说了,只说明一下在配置中如何激活flv模块:

在server配置中,加入如下语句,表明所有的flv文件由flv模块进行处理:

·········10········20········30········40········50········60········
1.location ~ \.flv { flv; }

lighttpd

从lighttpd下载最新的稳定版,本文写作时的最新稳定版的版本是1.4.24:

http://www.lighttpd.net/

下载后编译不需要特定选项,flv模块是默认编译进去的,但是在配置文件中并无此模块,需要手动添加:

在server.modules区块中加入如下语句来激活flv模块(如果不是插入到最后一行,记得末尾的逗号):

·········10········20········30········40········50········60········
1."mod_flv_streaming",

然后在配置文件中增加如下行来说明所有的Flv文件都由flv模块处理:

·········10········20········30········40········50········60········
1.flv-streaming.extensions = ( ".flv" )

说明:在以上两种HTTP服务器中,flv模块实际上会接收通过拖放播出而传递的类似 “?start=1030435” 这样的参数,并根据该参数传递从特定位置开始的视频数据。

这样,Flv视频服务器就安装好了。你可以试试播放Flv视频,也可以看看拖放是否工作。

如果你需要播放mp4视频,基本原理如上,只是需要额外的处理mp4文件的模块,在此就不赘述了。

搭建一个Flv视频播放服务器的更多相关文章

  1. Ubuntu 14.10下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具)

    Ubuntu 14.10下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具) 最近因为项目关系,收朋友之托,想制作秀场网站,但是因为之前一直没有涉及到这 ...

  2. CentOS6下基于Nginx搭建mp4/flv流媒体服务器

    CentOS6下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具) 1.先添加几个RPM下载源 1.1)安装RPMforge的CentOS6源 [roo ...

  3. 【日记】搭建一个node本地服务器

    用node搭建一个本地http服务器.首先了解htpp服务器原理 HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端.HTTP协议采用了请求/响应模型 ...

  4. 用nodejs搭建一个简单的服务器

    使用nodejs搭建一个简单的服务器 nodejs优点:性能高(读写文件) 数据操作能力强 官网:www.nodejs.org 验证是否安装成功:cmd命令行中输入node -v 如果显示版本号表示安 ...

  5. 初学Node(六)搭建一个简单的服务器

    搭建一个简单的服务器 通过下面的代码可以搭建一个简单的服务器: var http = require("http"); http.createServer(function(req ...

  6. 搭建一个webpack微服务器

    [前言]:因为最近在vue2.0的时候用到了webpack的externals,才发现我之前都只是用webpack做一些搭建完项目后的“收尾工作”——即打包,而没有把它纳入到项目开发的“主体过程”中来 ...

  7. Anroid搭建一个局域网Web服务器

    前言   很多开发者看到这个标题表示很怪异,Android怎么可能搭建服务器呢?根本用不到呀,这个项目毫无价值.我表示很理解这一类的开发者,毕竟每个人的经验经历都是有限的. 必须要说说我们的用处(需要 ...

  8. Node:使用express搭建一个简易的服务器

    ①安装node环境 在node.js官网下载LTS长期支持版本,然后傻瓜式安装 ②查看是否安装成功 打开cmd终端,输入node -v 有版本号,则安装成功.再输入npm -v 有版本号,则npm也安 ...

  9. netty系列之:来,手把手教你使用netty搭建一个DNS tcp服务器

    目录 简介 搭建netty服务器 DNS服务器的消息处理 DNS客户端消息请求 总结 简介 在前面的文章中,我们提到了使用netty构建tcp和udp的客户端向已经公布的DNS服务器进行域名请求服务. ...

随机推荐

  1. eclipse提示信息设置和提示信息操作

    1.提示信息设置 windows->preference->java->Editor->content Assist->Advance,选择需要提示的内容即可.如图所示: ...

  2. WinForm窗体间传值

    1.通过构造函数 特点:传值是单向的(不可以互相传值),实现简单 实现代码如下: 在窗体Form2中 int value1; string value2; public Form2 ( int val ...

  3. 如何查找MySQL中查询慢的SQL语句

    如何查找MySQL中查询慢的SQL语句 更多 如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow ...

  4. 拓扑排序 Codeforces Round #290 (Div. 2) C. Fox And Names

    题目传送门 /* 给出n个字符串,求是否有一个“字典序”使得n个字符串是从小到大排序 拓扑排序 详细解释:http://www.2cto.com/kf/201502/374966.html */ #i ...

  5. ISODATA算法

    ISODATA算法是在k-均值算法的基础上,增加对聚类结果的'合并'和'分裂'两个操作,并 设定算法运行控制参数的一种聚类算法. 全称:Iterative Selforganizing Data An ...

  6. Counting Squares[HDU1264]

    Counting Squares Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. BZOJ1172 : [Balkan2007]Dream

    $\gcd(ab,k)=\gcd(\gcd(a,k)\times \gcd(b,k),k)$ 设$f[i][j]$表示前$i$行,与$k$的$\gcd$为$j$的方案数,$h[i]$表示当前行选一个或 ...

  8. BZOJ3836 : [Poi2014]Tourism

    对于一个连通块,取一个点进行dfs,得到一棵dfs搜索树,则这棵树的深度不超过10,且所有额外边都是前向边. 对于每个点x,设S为三进制状态,S第i位表示根到x路径上深度为i的点的状态: 0:选了 1 ...

  9. 【POJ】3150 Cellular Automaton(矩阵乘法+特殊的技巧)

    http://poj.org/problem?id=3150 这题裸的矩阵很容易看出,假设d=1,n=5那么矩阵是这样的 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 ...

  10. POJ 3277 City Horizon(扫描线+线段树)

    题目链接 类似求面积并..2Y.. #include <cstdio> #include <cstring> #include <string> #include ...