PHP stream mp4, определяет, когда клиент прекращает потоковую передачу или отключается - PullRequest
0 голосов
/ 03 октября 2019

В настоящее время я прекрасно передаю свои mp4 файлы с помощью php. Моя проблема в том, как я могу определить, когда видео больше не просматривается или отключается? После этого мне нужно запустить функцию, чтобы я знал, что видео больше не просматривается для аналитики. Есть ли способ, может быть, с розетками или что-то? Я в настоящее время использую это.

if (file_exists($request)) {
        $fp = @fopen($request, 'rb');
        $size = filesize($request);
        $length = $size;
        $start = 0;
        $end = $size - 1;
        header("Content-Type: video/mp4");
        header('Accept-Ranges: 0-' . $length);

        if (isset($_SERVER['HTTP_RANGE'])) {
            $c_start = $start;
            $c_end = $end;
            list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);

            if (strpos($range, ',') !== false) {
                header('HTTP/1.1 416 Requested Range Not Satisfiable');
                header('Content-Range: bytes ' . $start . '-' . $end . '/' . $size);
                exit();
            }

            if ($range == '-') {
                $c_start = $size - substr($range, 1);
            }
            else {
                $range = explode('-', $range);
                $c_start = $range[0];
                $c_end = (isset($range[1]) && is_numeric($range[1]) ? $range[1] : $size);
            }

            $c_end = ($end < $c_end ? $end : $c_end);
            if (($c_end < $c_start) || (($size - 1) < $c_start) || ($size <= $c_end)) {
                header('HTTP/1.1 416 Requested Range Not Satisfiable');
                header('Content-Range: bytes ' . $start . '-' . $end . '/' . $size);
                exit();
            }

            $start = $c_start;
            $end = $c_end;
            $length = ($end - $start) + 1;
            fseek($fp, $start);
            header('HTTP/1.1 206 Partial Content');
        }

        header('Content-Range: bytes ' . $start . '-' . $end . '/' . $size);
        header('Content-Length: ' . $length);
        ob_end_flush();
        $buffer = 8192;
        $time_start = time();
        $bytes_read = 0;

        while (!feof($fp) && (($p = ftell($fp)) <= $end)) {
            $response = stream_get_line($fp, $buffer);
            echo $response;
            $bytes_read += strlen($response);

            if (30 <= time() - $time_start) {
                file_put_contents('/var/www/html/movieCon/'.$user.'_'.$token.'_'.$movie_id.'.con', time());
                $time_start = time();
                $bytes_read = 0;
            }
        }

        fclose($fp);
        exit();
    }
...