如何使用PHP提供.flv文件服务?

6
我正在建设一个流媒体视频网站。想法是用户需要付费成为会员,登录系统,然后可以观看视频。我选择使用FlowPlayer来显示实际的视频。
问题是现在,视频需要存储在某个公共场所,并且.flv文件的URL需要传递给FlowPlayer才能显示它们。这会导致一个问题,因为任何人都可以查看源代码,下载视频并在整个互联网上分发它。
我知道一些人使用php提供图像服务,通过执行image header(),然后他们可以做类似的事情:
<img src="image.php?userId=1828&img=test.gif" />

这个 PHP 脚本验证用户 ID 并提供 .gif 文件,而实际的 .gif 文件 URL 没有被公开。

是否有任何方法也能用于 .flv 或其他视频格式呢?例如,文件和用户 ID 传递给 PHP 脚本,它验证它们并返回视频?


1
无关的旁注:HTML转义应该是“src="image.php?userId=1828&img=test.gif"”。 - bobince
5个回答

5

您可以在Web服务器上设置一个目录,其中包含只能由PHP访问的FLV文件,然后在PHP脚本中像往常一样对用户进行身份验证,并向浏览器发送一个标头,告诉它要求FLV,然后回显原始FLV数据:

<?php
// here is where
// you want your
// user authentication

if ($isAuthenticated)
{
  header("Content-type: video/flv");
  echo file_get_contents($pathToFLV);
}
?>

正如Chad Birch所讨论的那样,这只能防止人们直接链接到视频 - 无法通过此方式防止盗版。

1
当然,这并不能阻止人们在流媒体播放器渲染视频后捕获它。但我想这会以父级希望的方式混淆它。 - Tuxmentat
我计划使用一个票务系统,这样每次他们在我的网站上点击视频时,它将生成一个一次性使用的票据ID,并将其传递给FLV服务脚本。 - Ali
每个票据ID只能使用一次。一旦它被FLV服务脚本接收并验证,它就会被删除,因此不能再使用。他们如何在这个系统中盗版呢? - Ali
他们只是代替你的玩家请求购票,你真的无法阻止它。 - Chad Birch
@点击点赞[10:49]:用户经过身份验证后,您将数据发送给他们。即使是您的播放器发出请求,用户也可以从数据包流中获取响应。用加密类比来说,这里的Alice和Eve是同一个人,即您不能既要鱼又要熊掌。 - Piskvor left the building
4
这将一次性提供整个文件,在PHP完全读取文件后,这将导致视频流传播失败。你应该使用fread按8k大小分块读取文件,输出每个分块,然后调用flush()以确保PHP服务器将其输出缓存刷新到客户端(即视频播放器)。 - Petruza

3

简单来说,不,如果别人想下载您的视频,您永远无法阻止他们。有多种方法可以使其难以实现,但没有绝对可靠的方法。这基本上是数字版权管理(DRM)的整个问题所在 - 您无法在某些时候不加密地向某人展示内容,如果他们可以查看它,就可以复制它。


我的想法是,用于下载的URL在下一次尝试时将无法使用。也就是说,每个URL只能使用一次。在这种情况下,他们该如何下载它呢? - Ali
只需一次 - 在播放器中播放文件的同时,捕获您发送的数据包并将数据保存到磁盘中。 - Piskvor left the building
你可以做的最好的事情是期望阻止新手直接下载视频,但是允许黑客或拥有正确工具的人无论如何下载视频。YouTube这样做,你也可以这样做。毕竟,如果视频在用户屏幕上显示,他们已经以某种方式下载了它。 - Petruza

0

由于您的FLV播放器是一个Flash应用程序,因此始终可以下载和反编译它。当反编译时,FLV的实际URL将可见。因此,如果您正在使用直接URL访问FLV电影或类似您在问题中描述的内容,实际上并没有什么区别。

<img src="image.php?userId=1828&img=test.gif" />

0

使用 mod_flvx 模块的 Apache 也具有类似于 lighttpd 的效果。


0
请谷歌搜索单词伪流媒体,您将得到答案。像lighttpd这样的服务器具有内在的FLV流支持...我希望您能得到答案...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接