P2PS点播开发示例文档
P2PS的下载安装可参见:www.800li.net/download/p2ps_setup.pdf.
为了准确演示使用域名的网站使用P2PS的情况,我们在计算机的HOSTS文件中加入了一行“127.0.0.1 sample.com”,这样我就可以在本机上开发并使用域名sample.com进行测试了。
首先我们先清点一下使用P2PS开发点播网站需要的一些必须的部件,http服务器(含php)、flv分段工具、P2PS的p2p服务器、flash播放器。它们的关系是这样的,通过脚本上传flv格式的视频文件到服务器,然后使用flv分段工具把视频文件分段成为P2PS的点播格式,这些分段文件放在http服务器的文件档目录的某个位置,然后flash播放器使用分段文件的路径和p2p服务器的地址来进行播放,通过http服务器进行视频的数据的下载播放,通过连接p2p服务器以实现p2p网络中的视频文件内容交换。
一、准备工作
然后我们再来一步一步地来开发一个视频点播网站的示例程序,我们使用apache做为http服务器,p2p服务器就使用P2PS安装后使用的域名和端口。
在网站根目录下面新建文件夹VODS,并从P2PS安装目录下面的“\lmp\htdocs\sample”拷贝p2ps_sdk目录、config.php、player.swf、play_core.swf拷贝至VODS下面,并新建videos目录。
二、配置文件修改
将config.php里多余的内容去掉,只留下$_url_p2p_streaming、$_url_stat、$_url_http_player、$_url_http_streaming等变量。其中$_url_p2p_streaming是p2p服务器的地址,$_url_stat是与后台统计系统结合的url(非必需),$_url_http_player是player.swf和play_core.swf的url的共同前缀,$_url_http_streaming是访问视频分段文件使用的url前缀。
三、视频文件上传和分段
设置PHP的上传文件大小限制,在PHP.ini里面设置upload_max_filesize = 1000M,我临时设置为1G,用户可以根据自己的需求来设置。如果使用的是lighttpd服务器,还要设置类似于server.max-request-size = 10000000,server.upload-dirs = ( "C:\Users\moyea\AppData\Local\Temp" )的配置,其它web服务器按照帮助文件进行修改。
为了安装路径中的空格影响php对分段工具的调用,我们将flv分段工具从“p2ps安装路径/lmp/htdocs/p2ps_sdk/flvsegmentor.exe”拷贝到系统目录"C:"(也可以设置其它无空格的目录,只要和代码中使用的一致即可)下面,。
在vods文件夹中新建一个vod.php文件,然后先实现文件上传和视频分段代码。
<?php
require_once(dirname(__FILE__) . "/config.php");
require_once(dirname(__FILE__) . "/p2ps_sdk/p2ps_sdk.php");
@header('Content-Type:text/html;charset=utf-8');
?>
<form action="vod.php" method="post"
enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="hidden" name="max_file_size" value="20000000">
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="上传文件" />
</form>
<?php
$videos_dir = $_videos_folder;
echo "hello";
///分段文件
if(isset($_FILES["file"])){
if ($_FILES["file"]["type"] != "video/x-flv")
{
die("只支持FLV文件");
}
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
move_uploaded_file($_FILES["file"]["tmp_name"], $videos_dir. DIRECTORY_SEPARATOR. $_FILES["file"]["name"]);
$fs = new flvsegmentor("C:\\");
$flvs = array($videos_dir . "\\" . $_FILES["file"]["name"]);
$re = $fs->segment($flvs, $videos_dir);
if(!$re){
die("对视频分片出错".$re);
}
}
}
?>
在上面的代码中,我们首先创建了一个表单,这个表单的作用就是选择文件并上传,在上传文件的处理代码中我们加入了对文件类型的判断只允许上传flv文件,并且在上传文件之后,把文件复制到config.php定义的文件夹中,然后调用p2ps的sdk中的flvsegmentor类(关于此类的介绍可参考p2ps安装程序内的开发说明文档)对视频文件进行分段。
四、枚举视频文件并生成播放器
接下来我们的思路是,枚举视频文件夹里的所有视频,然后统一用列表列出来,然后选择任意一个视频点击播放时,就生成播放器代码对这个视频进行播放。所以先写出两个功能函数createPlayer和read_dir_all,createPlayer用来根据流名称来生成播放器代码,而read_dir_all用来扫描一个目录下面的所有特定后缀的文件列表。其中在createPlayer中,我们引用了config.php中的几个配置参数,并且在拼装播放器代码时使用了这几个变量,最后形成的几个关键部分是player.swf的路径,flashVars中传递给播放器的server_url(p2p服务器地址)、stream_name(要播放的视频文件的绝对路径)、stat_url(统计接口的url)。
///返回player的代码
function createPlayer($videoName)
{
global $_url_p2p_streaming;
global $_url_http_player;
global $_url_stat;
global $_url_http_streaming;
//构造播放URL
$playURL = $_url_http_streaming. "$videoName";
$connectURL = $_url_p2p_streaming;
$playerCode = '<embed src="'.$_url_http_player.'player.swf" flashVars="server_url='.$connectURL.'&stream_name='.$playURL.'&stat_url='.$_url_stat.'" width="600" height="360" allowFullScreen="true"></embed>';
return $playerCode;
}
//扫描存在的分段文件
function read_dir_all($dir, $ext=null) {
$ret = array();
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle))) {
if($file != '.' && $file !== '..') {
$a = explode(".", $file);
if(isset($ext) && $a[max(0, count($a) - 1)] != $ext){
continue;
}
$cur_path = $file;//$dir . DIRECTORY_SEPARATOR .
if(!is_dir($cur_path)) {
$ret[] = $cur_path;
}
}
}
closedir($handle);
}
return $ret;
}
功能函数有了之后, 现在就是要写枚举视频文件的逻辑和播放器的代码了。我们使用了PHP代码检测post的数据中是否有stream_id,如果有就说明有一个提交表单进行播放的动作,我们就根据提交的视频文件的名称,来生成播放器代码并且显示。
$stream_id = @$_POST["stream_id"];
<?php if(isset($stream_id)) {
$playerCode = createPlayer($stream_id);
$encodeCode = htmlspecialchars($playerCode);
echo "<div>$playerCode</div>";
echo '<strong>播放器代码:</strong><input type="text" name="code" id="code" style="width:400px" value="'.$encodeCode.'" />';
}
?>
接下来就是一个枚举视频文件夹内的所有点播文件的代码,在一个表单中枚举出所有的视频文件,然后形成一个列表,可以对某一项进行选择并且点击按钮进行表单提交,以生成播放器代码进行播放。
<form action="vod.php" method="post" >
<?php
$vods = read_dir_all($videos_dir,"fpvsegments");
foreach($vods as $s) {
?>
流: <input type="text" name="streams[]" value="<?php echo $s;?>" size="80" /><input type="radio" name="stream_id" <?php if ($s == $stream_id) echo "checked"; ?> value="<?php echo $s;?>" />
<br/>
<?php
}
?>
<input type="submit" name="play" value="播放选中" style="width:600px" />
</form>
</body>