使用 fork 流式传输视频不会返回内容


Streaming video using fork does not return content

当我尝试两次请求相同的视频流时,我遇到了某种超时,因此我认为分叉可以解决我的问题。

在开始之前,我将使用第三方类来传输视频流。使用我自己的路由系统可以工作,但我有上述问题。

public function stream ($req, $res) {
    $video = c_video_folder . $req->get_param('id') . '.mp4';
    if (file_exists($video)) {
        $res->videoStream($video);
    } else {
        $res->failure(204); // no content
    }
}

尝试使用分叉后,它看起来像这样:

public function stream ($req, $res) {
    $video = c_video_folder . $req->get_param('id') . '.mp4';
    if (file_exists($video)) {
        $pid = pcntl_fork();
        if ($pid == -1) {
            $res->videoStream($video);
        } else { //async
            $res->videoStream($video);
        }
    } else {
        $res->failure(204); // no content
    }
}

出现的问题是响应包不包含任何数据,除了正确的标头等。有谁知道为什么会这样?

参数$res,只是另一个类设置标头,然后调用顶部链接的VideoStream类。

没有必要开始使用 forks 和 pthreads 来处理这个问题,即使我这样做了也不能解决我的问题。

发生的情况是,当我尝试刷新页面时,在缓冲完成之前它不会让我刷新。

那么如何停止在 html5 视频标签中缓冲呢?很简单,您必须暂停视频,缓冲将停止使您能够刷新页面。

甚至在

开始视频之前停止缓冲区以避免进一步的问题也很重要(例如视频下次不会加载,不幸的是我不知道为什么会发生这种情况)。使用 Angular.js我通过收听页面刷新、将音量设置为 0(播放时静音)、启动视频并暂停它来解决这个问题。它工作得很好,这是我是如何做到的:

angular.element($window).on('beforeunload', function (event) {
        vp.volume = 0;
        vp.play();
        vp.pause();
    });