如何在通过 PHP 脚本传送文件时启用流式传输?

如何在通过 PHP 脚本传送文件时启用流式传输?

我正在尝试在我的内容服务器上启用 mp4 流。由于与我合作的一些安全狂热分子,所有文件都通过 php 脚本传送,并具有以下 url 格式:

http://server.com/cdn/3/getObject?param1=71&param2=1002&file=File1000.mp4

因此,所有标准格式的流式请求(例如以下 URL)都会因附加参数而失败

http://server.com/cdn/3/getObject?param1=71&param2=1002&file=File1000.mp4?start=10.0

我目前正在运行 nginx,其中已编译并运行 mp4 流式传输模块。我正在考虑进行 URL 重写以启用流式传输,但目前还没有成功。除此之外,我还必须在下一步中启用安全流式传输...

任何帮助都将受到高度赞赏。

更新:

看来我的问题还不够清楚。

我不想使用 PHP 脚本或其他任何脚本来流式传输我的 mp4 文件。我的问题是使用 PHP 脚本来确定文件的路径,这是因为我需要确保人们不能猜测其他 URL。因此,如果所有其他参数都符合要求,getObject 脚本只会返回请求的文件而不做任何修改或其他操作。现在的问题是,这使得无法流式传输文件。任何尝试流式传输 mp4 文件(例如使用 flowplayer)都会失败,即使启用了流式传输模块也是如此。

答案1

根本没有 HTTP Steaming 这回事。不过,有几种方法可以模拟它。

第一个也是最古老的方法是使用Range:标头来指定客户端想要的文件块。没有什么可以阻止 PHP 脚本根据该标头发送正确的块,它只需读取标头并返回带有文件数据的正确响应标头即可。

第二种方法是使用某种类型的服务器模块,该模块可以理解正在流式传输的文件的格式,并在每个时间段内提供“正确”的数据量。这就是 ngninx 的 mp4 模块所做的。也许可以编写一个 PHP 脚本来计算文件的数据速率,然后以该速率发送文件,但我不知道有哪种脚本,而且编写这样的脚本会很困难。

相关内容