【问题标题】:Video streaming with php. Why is the response slow?使用 php 进行视频流式传输。为什么反应慢?
【发布时间】:2022-02-03 23:41:33
【问题描述】:

我有一个大问题。我有一个视频流媒体网站。该网站有公开和私人视频,购买后可以看到私人视频。

这里可以看到目录结构:

    /public_html
    |__/vendor
    |__/src
    |__/public
    |__/product
       |__/sample-video
          |__/video.mp4

好吧,您可以看到视频位于公共文件夹之外。目标是使它们无法直接访问。

这是树枝:

<video id="myVideo">
   <source src="/products/12?video=10&cache={{ random(50, 10000) }}" type="video/webm" />
   <source src="/products/12?video=10&cache={{ random(50, 10000) }}" type="video/mp4" />
</video>

视频控制器: https://pastebin.com/sne1mSHH

以及视频流逻辑: https://pastebin.com/2Sxd7Nqq

问题来了:

我要去现场。您在页面之间切换。非常好。我转到一个视频仍然很好的页面,在我开始播放视频后,页面不好..页面只是加载并且什么都不做。我不能再在页面之间切换了。我必须关闭隐身模式并开始一个新会话。

直到现在我还以为是会话锁的问题,但我关闭了写入会话。

我尝试在新标签页中打开视频。此外,错误是直到视频流完成,页面才处理请求。

因此,在播放视频时,我无法发送新请求。 我还可以附加什么来使错误更加透明? 请帮忙!

【问题讨论】:

    标签: php symfony video-streaming html5-video


    【解决方案1】:

    我个人不会使用 PHP 流式传输视频。问题是您将不得不锁定许多 PHP 进程来读取和流式传输大文件,而不是处理逻辑。在此过程中,您还将有 PHP 超时。

    相反,我会使用 Sendfile 模块:

    • 您为您的网络服务器、NGINX 等安装了一个 Apache 模块或其他类型的 Sendfile 模块。

    • PHP 中,您执行保护逻辑,只需发送一个 HTTP 标头表示您希望 Sendfile 处理流式传输。这样,您的 PHP 代码将停止运行,并且它的 Web 服务器将停止处理文件的传输。

    类似这样的:

    <?php
    if (has_access_to_the_video($file))
    {
        // Send the right HTTP headers.
        header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
        header('Cache-Control: post-check=0, pre-check=0', false);
        header('Pragma: no-cache');
        header('Content-type: ' . mime_content_type($file));
        header('Content-Length: ' . filesize($file));
    
        // Make sure you have X-Sendfile module installed on your server.
        header('X-Sendfile: ' . $file);
        exit;
    }
    else
    {
        // Generate your 403 error or whatever.
    }
    

    这可能会对您有所帮助:

    关于您的视频来源的另一条评论

    对于&lt;video&gt; 标记,您声明了两个&lt;source&gt; 元素,一个带有type="video/webm",另一个带有type="video/mp4",但都指向同一个URL。在您的 PHP 逻辑中,我没有看到对所需内容类型的任何处理,因此 您的服务器可能为两个编解码器返回相同的视频文件,这是有问题的。我会在 URL 和服务器端添加视频内容类型,使用 Sendfile 将内部重定向到正确的文件(MP4、OGG、WEBM 等)。如果浏览器请求WEBM 文件并收到MP4 H.264,我认为它不会正确加载。

    似乎MP4 H.264 被know 广泛处理,因此您可以只使用一个来源。在此处查看当前支持:

    【讨论】:

    • 谢谢解答!!!我的服务器上安装了 litespeed。原则上,这行得通吗? litespeedtech.com/support/wiki/doku.php/…“公共目录”是根目录。产品文件夹位于公用文件夹之外。只有X-Sendfile才能访问根目录外的文件吗?
    • 好吧,我从来没有使用过 Litespeed,但是关于你提到的 wiki 页面,你似乎必须把你的视频放在文档根目录下面而不是外面(为了安全起见原因)。我会将它们放在诸如videos/64hbGiKrw7eQbk 之类的子文件夹中,这样不容易猜测然后还添加一个重写规则以拒绝直接访问文件(如 wiki 中所述),然后返回 HTTP 标头以启动 Litespeed 使用 header('X-LiteSpeed-Location: /videos/64hbGiKrw7eQbk/video-48392.mp4'); 提供文件而不是 PHP
    • 感谢您的帮助!错误仍然存​​在,但仅在 Chrome 中。在 Firefox 中,解决方法非常有效。
    • @Laszlo :我添加了关于&lt;source&gt; 标签的解释,这些标签可能正在加载相同的视频文件,可能使用了错误的编解码器。希望这是你的第二个问题。我认为,如果您声明多个来源,浏览器不会都决定下载 MP4 文件。一种浏览器可能更喜欢 OGG 或 WEBM。检查caniuse.com/mpeg4caniuse.com/webmcaniuse.com/?search=ogg
    • 哦.. 非常感谢!这个解决方案很完美,我的问题解决了。我以前从未想过,这可能是&lt;source&gt; 的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 2016-12-02
    • 2023-03-31
    • 1970-01-01
    • 2016-05-25
    • 2020-12-26
    • 2017-07-26
    • 2021-05-14
    相关资源
    最近更新 更多