PHP SilverStripe 中的视频流 class

PHP VideoStream class in SilverStripe

我正在使用 VideoStream class 并且效果很好。我尝试将它集成到 Page_Controller 中并保护视频不被上传。所以每次加载页面时,视频 link 总是在重新加载时发生变化,没有人可以直接从浏览器下载它 URL。

但是 class 似乎不起作用,我不知道我错过了什么。我还使用 ChunkedUpload 模块将大文件上传到 CMS。

知道如何使用 class 吗?

这是我的代码。

注意:我的代码有效,我在下面注明 "my original..."

PageVideo.ss

<video controls preload="auto" id="video1">
    <% if $VideoMP4 %><source src="id/$Video($VideoMP4.ID)" type="video/mp4"><% end_if %>
    Your browser does not support HTML5 video.
</video>

PageVideo.php

class PageVideo extends Page {

    private static $has_one = array(
        'VideoMP4' => 'File'
    );

    function getCMSFields() {
        $fields = parent::getCMSFields();

        $fields->addFieldToTab(
            'Root.Main ',
            $uploadField = new ChunkedUploadField(
                $name = 'VideoMP4',
                $title = "VideoMP4"
            )
        );

        $uploadField->setFolderName('Uploads/videos/');
        $uploadField->setDisplayFolderName('Uploads/videos');
        $uploadField->getValidator()->allowedExtensions = array("mp4");

        $sizeMB = 500 * 1024 * 1024; // 500 MB in bytes
        $uploadField->getValidator()->setAllowedMaxFileSize($sizeMB);
        $uploadField->setConfig('maxChunkSize', .05 * 1024 * 1024 );

        return $fields;
    }
}

class PageVideo_Controller extends Page_Controller {

    private static $allowed_actions = array('VideoGrab');
    private static $url_handlers = array('id/$hash' => 'VideoGrab');

    public function VideoGrab(SS_HTTPRequest $request) {

        $hash = $request->param('hash');

        $file = File::get()->filter('ID', $_SESSION['keyID'])->first();

        if (md5($file->Name . $_SESSION['key']) == $hash) {

            $_SESSION['key'] = "";
            $_SESSION['keyID'] = "";

            //**************** HERE IS THE CLASS *********************
            include "libraries/VideoStream.php";
            $stream = new VideoStream($file->AbsoluteURL);
            $stream->start();
            exit;

            // the original php working just for some browsing and bad codes
            /*
            $ext = pathinfo($file->Filename);
            header('Cache-control: private');
            header('Content-Type: video/' . $ext['extension']);
            header('Accept-Ranges: bytes');
            header("Content-Transfer-Encoding: binary");

            return readfile($file->AbsoluteURL);
            exit;
            */
        } else {
            return $this->httpError(404, "Not Found");
        }
    }

    public function Video($n) {

        $file = File::get()->filter('ID', $n)->First();
        $_SESSION['key'] = time();
        $_SESSION['keyID'] = $file->ID;

        return md5($file->Name . $_SESSION['key']);
    }
}

这是一种方法。

Class

class PageVideo extends Page {

    private static $has_one = array(
        'VideoMP4' => 'File'
    );

    function getCMSFields() {
        $fields = parent::getCMSFields();

        $fields->addFieldToTab('Root.Video', $uploadField = UploadField::create('VideoMP4'));

        $uploadField->setFolderName('Uploads/videos/');
        $uploadField->getValidator()->allowedExtensions = array('mp4');

        return $fields;
    }
}

class PageVideo_Controller extends Page_Controller {

    private static $allowed_actions = array(
        'VideoStream'
    );

    function VideoStream() {
        if ($this->VideoMP4()->exists()) {
            include 'libraries/VideoStream.php';
            $stream = new VideoStream($this->VideoMP4()->getFullPath());
            return $stream->start();
        }
        return false;
    }
}

模板

<% if $VideoMP4 %>
<video controls preload="auto" id="video1">
    <source src="{$Link}VideoStream" type="video/mp4">
    Your browser does not support HTML5 video.
</video>
<% end_if %>