Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php的流式视频/mp4_Php_Video_Stream_Mp4 - Fatal编程技术网

使用php的流式视频/mp4

使用php的流式视频/mp4,php,video,stream,mp4,Php,Video,Stream,Mp4,我在通过php传输mp4文件时遇到问题。 下载文件的时间为1MB。你可以在这里看到: 我尝试了很多标题,读了很多线程,但是很多都没有解决或者没有帮助我,比如这个:。需要帮忙吗 这是我的代码: <? $root=getenv("DOCUMENT_ROOT"); $file = "$root/".$_GET['get']; header("Content-Type: video/mp4"); //header("Content-Type: application/octet-stream");

我在通过php传输mp4文件时遇到问题。 下载文件的时间为1MB。你可以在这里看到: 我尝试了很多标题,读了很多线程,但是很多都没有解决或者没有帮助我,比如这个:。需要帮忙吗

这是我的代码:

<?
$root=getenv("DOCUMENT_ROOT");
$file = "$root/".$_GET['get'];
header("Content-Type: video/mp4");
//header("Content-Type: application/octet-stream"); // downloads the file

$start=0;
$size = filesize($file);
$length = $size;
$end = $size - 1;

//header('HTTP/1.1 206 Partial Content');
header("Accept-Ranges: $start-$end");
header("Content-Range: bytes $start-$end/$size");
header("Content-Length: $length");


$data = fopen("$file", "r");
fseek($data, $start);

$bytesleft = $size-$start + 1;
$buffer = 1024 * 256; // 256kb
while(!feof($data)){
    if($bytesleft > $buffer){
        echo fread($data, $buffer);
        flush();
    }else{
        echo fread($data, $bytesleft);
        flush();
    }
    //sleep(1);  // Speedlimit = one buffer per second
}


fclose($data);
exit;
?>


提前谢谢

不用客气。我从服务器下载了该文件,并将其与服务器上以十六进制存储的原始文件进行了比较。
下载的版本在开始时多了一个字节:0A,这就是问题所在。现在一切正常。

此代码非常危险。考虑<代码>示例.com?代码。php?id =….. /…/…/….. /…/ETC/PASSWD < /代码>。你允许用户在你的服务器上抓取任何文件。啊,我明白了。好的,谢谢,等我把这个弄到手后,我再做保安。有什么想法吗,怎么了?我看不出有什么“错误”。大量的cargo cult编程符号,我不知道你为什么要为这个大的
bytesleft>缓冲区而烦恼-fread不能超过文件的结尾,而且你永远不会更新
$bytesleft
。好吧,我会删除$bytesleft等。但是代码不会从PHP手册页面复制:)flush()可能无法覆盖web服务器的缓冲方案,并且对浏览器中的任何客户端缓冲都没有影响。它也不会影响PHP的用户空间输出缓冲机制。这意味着您必须调用ob_flush()和flush()来刷新ob输出缓冲区(如果您正在使用这些缓冲区)。-另外,检查以确保没有遇到任何脚本超时。另外,$start-$end是负数,如果只有一个块,那么就没有必要设置内容“范围”。总的来说,在尝试这一点之前,要做更多的研究。