作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 ubuntu 16 上这是在/html 文件夹外的 var/www/uploads 中,目前为 chmod 777(测试)。如果您在下载视频时尝试暂停,它将播放然后出现错误:
图片.php
<?php
$filename = $_GET['filename'];
header('Content-Type: video/mp4');
readfile("../uploads/" . $filename);
?>
html
<video id="my_video_1" class="video-js vjs-default-skin" width="100%" height="100%"
controls preload="none" poster='img.png'
data-setup='{ "playbackRates": [1, 1.5, 2] }'>
<source src="image.php?filename=myfile.mp4" type='video/mp4' />
</video>
有效,但在 www/html/uploads 内,chmod 777。完全没有错误。这是不好的做法:
<video id="my_video_1" class="video-js vjs-default-skin" width="100%" height="100%"
controls preload="none" poster='img.png'
data-setup='{ "playbackRates": [1, 1.5, 2] }'>
<source src="uploads/myfile.mp4" type='video/mp4' />
</video>
您还想用 mp4 做什么来阻止这种情况发生?
最佳答案
最好的方法是使用“字节范围” header ——这只会返回您需要的文件 block 。维基百科有一个非常简短的介绍 ( https://en.wikipedia.org/wiki/Byte_serving ),但您可以通过谷歌搜索更多内容。
这是我为我的项目编写的函数 - 您可能需要调整它以满足您的具体需求,但它非常通用并且可能开箱即用。
function serve_file_resumable ($file, $contenttype = 'application/octet-stream') {
// Avoid sending unexpected errors to the client - we should be serving a file,
// we don't want to corrupt the data we send
@error_reporting(0);
// Make sure the files exists, otherwise we are wasting our time
if (!file_exists($file)) {
header("HTTP/1.1 404 Not Found");
exit;
}
// Get the 'Range' header if one was sent
if (isset($_SERVER['HTTP_RANGE'])) {
$range = $_SERVER['HTTP_RANGE']; // IIS/Some Apache versions
} else if ($apache = apache_request_headers()) { // Try Apache again
$headers = array();
foreach ($apache as $header => $val) {
$headers[strtolower($header)] = $val;
}
if (isset($headers['range'])) {
$range = $headers['range'];
} else {
$range = false; // We can't get the header/there isn't one set
}
} else {
$range = false; // We can't get the header/there isn't one set
}
// Get the data range requested (if any)
$filesize = filesize($file);
if ($range) {
$partial = true;
list($param,$range) = explode('=',$range);
if (strtolower(trim($param)) != 'bytes') { // Bad request - range unit is not 'bytes'
header("HTTP/1.1 400 Invalid Request");
exit;
}
$range = explode(',',$range);
$range = explode('-',$range[0]); // We only deal with the first requested range
if (count($range) != 2) { // Bad request - 'bytes' parameter is not valid
header("HTTP/1.1 400 Invalid Request");
exit;
}
if ($range[0] === '') { // First number missing, return last $range[1] bytes
$end = $filesize - 1;
$start = $end - intval($range[1]);
} else if ($range[1] === '') { // Second number missing, return from byte $range[0] to end
$start = intval($range[0]);
$end = $filesize - 1;
} else { // Both numbers present, return specific range
$start = intval($range[0]);
$end = intval($range[1]);
if ($end >= $filesize || (!$start && (!$end || $end == ($filesize - 1)))) {
$partial = false; // Invalid range/whole file specified, return whole file
}
}
$length = $end - $start + 1;
} else {
$partial = false; // No range requested
$length = $filesize;
}
// Send standard headers
header("Content-Type: $contenttype");
header("Content-Length: $length"); // was $filesize
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Accept-Ranges: bytes');
// if requested, send extra headers and part of file...
if ($partial) {
header('HTTP/1.1 206 Partial Content');
header("Content-Range: bytes $start-$end/$filesize");
if (!$fp = fopen($file, 'r')) { // Error out if we can't read the file
header("HTTP/1.1 500 Internal Server Error");
exit;
}
if ($start) {
fseek($fp,$start);
}
while ($length) { // Read in blocks of 8KB so we don't chew up memory on the server
$read = ($length > 8192) ? 8192 : $length;
$length -= $read;
print(fread($fp,$read));
}
fclose($fp);
} else {
readfile($file); // ...otherwise just send the whole file
}
// Exit here to avoid accidentally sending extra content on the end of the file
exit;
}
serve_file_resumable ("../uploads/" . $filename, 'video/mp4');
关于php - 如何在 html 文件夹之外无错误地流式传输视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41572218/
我是一名优秀的程序员,十分优秀!