php - Streaming Video: Failure on (most) browsers

858

I am storing my videos outside of web root, and stream them on request. It works perfectly in firefox and chrome - but fails in IE, safari (mac) and iPad. IE ReportsError: Unsupported video type or file path

The request is made like so:

<video width="600" height="300">
<source src="http://myserver.com/getVideo?key=<somehash>&file=video.mp4 type="video/mp4">
</video>`

however if I call the video directly (without streaming, and the location is in web root), it works in every browser, as expected. I believe it has something to do with the way I am streaming. Any ideas?

public function actionGetvideo(){
    $filename = $_GET['file'];
    $filepath = $_GET['path'];

    if ($_GET['k'] != $this->gen_access_key($filename)) {
        throw new CHttpException(403, "unauthorized 1");
        exit('access key fail');
    }
    $filepath = '/home/columbin/' . $filepath . $filename;
    if (!file_exists($filepath)) {
        throw new CHttpException(404, "This video does not exist");
        exit('file does not exist');
    }

    $content_type = 'video/mp4';
    $filesize = filesize($filepath);
    $fp = fopen($filepath, 'r');
    if (!$fp) exit('no file');

    $content_length = $filesize;
    header('Content-Type: '.$content_type);
    header('Content-length: '.filesize($full_request_path));

    ob_clean();
    flush();
    $this->readfile_chunked($filepath);
}

protected function readfile_chunked($filename,$retbytes=true) {
    $chunksize = 1*(1024*1024); // how many bytes per chunk
    $buffer = '';
    $cnt =0;
    $handle = fopen($filename, 'rb');
    if ($handle === false) {
        return false;
    }
    while (!feof($handle)) {
        $buffer = fread($handle, $chunksize);
        echo $buffer;
        ob_flush();
        flush();
        if ($retbytes) {
            $cnt += strlen($buffer);
        }
    }
    $status = fclose($handle);
    if ($retbytes && $status) {
        return $cnt; // return num. bytes delivered like readfile() does.
    }
    return $status;

}
272

Answer

Solution:

I think I found a solution for you: here
I believe your problem has to do with headers not being set correctly. Look at the second answer. Hope it works.

People are also looking for solutions to the problem: php - Sending an email verification after registering

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.