PHP stream remote video file

前端 未结 2 1645
花落未央
花落未央 2021-01-07 12:26

Let\'s say I have a video on a remote server and this its url

\"http://domain/video-path/video.mp4\"

What is the correct way to stream this video using php w

相关标签:
2条回答
  • 2021-01-07 12:33

    After the other answers on this hadn't been working for me, I've finally found (after much tweaking) a new solution to this which is working for remote/local files.

    <?php 
    
    $file = 'https://yourfilelocation';
    
    $head = array_change_key_case(get_headers($file, TRUE));
    $size = $head['content-length']; // because filesize() won't work remotely
    
    header('Content-Type: video/mp4');
    header('Accept-Ranges: bytes');
    header('Content-Disposition: inline');
    header('Content-Length:'.$size);
    
    readfile($file);
    
    exit;
    
    ?>
    

    This allows tracking etc. too, enjoy!

    0 讨论(0)
  • 2021-01-07 12:50

    I'm using this, working both local & external video, seekable & resumable

    ini_set('max_execution_time', 0);
    $useragent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36";
    $v = $_GET['url'];
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 222222);
    curl_setopt($ch, CURLOPT_URL, $v);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $info = curl_exec($ch);
    $size2 = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
    header("Content-Type: video/mp4");
    $filesize = $size2;
    $offset = 0;
    $length = $filesize;
    if (isset($_SERVER['HTTP_RANGE'])) {
        $partialContent = "true";
        preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches);
        $offset = intval($matches[1]);
        $length = $size2 - $offset - 1;
    } else {
        $partialContent = "false";
    }
    if ($partialContent == "true") {
        header('HTTP/1.1 206 Partial Content');
        header('Accept-Ranges: bytes');
        header('Content-Range: bytes '.$offset.
            '-'.($offset + $length).
            '/'.$filesize);
    } else {
        header('Accept-Ranges: bytes');
    }
    header("Content-length: ".$size2);
    
    
    $ch = curl_init();
    if (isset($_SERVER['HTTP_RANGE'])) {
        // if the HTTP_RANGE header is set we're dealing with partial content
        $partialContent = true;
        // find the requested range
        // this might be too simplistic, apparently the client can request
        // multiple ranges, which can become pretty complex, so ignore it for now
        preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches);
        $offset = intval($matches[1]);
        $length = $filesize - $offset - 1;
        $headers = array(
            'Range: bytes='.$offset.
            '-'.($offset + $length).
            ''
        );
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 222222);
    curl_setopt($ch, CURLOPT_URL, $v);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
    curl_setopt($ch, CURLOPT_NOBODY, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
    curl_exec($ch);
    
    0 讨论(0)
提交回复
热议问题