gpt4 book ai didi

php - VideoJS Flash 版本不播放文件(PHP 直通流)

转载 作者:搜寻专家 更新时间:2023-10-31 20:43:11 25 4
gpt4 key购买 nike

我正在使用最新版本的 VideoJS 并按以下方式通过 PHP 放置我的视频:

调用方式如下:$this->streaming->handleDownload($videoPath, "video/mp4");

函数定义如下:

public function handleDownload($file, $mime = "") {
if (is_file($file)) {
header("Content-Type: $mime");

if (isset($_SERVER['HTTP_RANGE'])) { // do it for any device that supports byte-ranges not only iPhone
header("X-Info: Starting Ranged Download of $file");
$this->rangeDownload($file);
} else {
header("Content-Length: ".filesize($file));
header("X-Info: Starting Straight Download of $file");
readfile($file);
}
} else {
header("HTTP/1.1 500 Internal Server Error");
$msg = "The requested path was no file!";
}
}

rangeDownload() 定义为:

private function rangeDownload($file) {
ob_end_clean();
$fp = @fopen($file, 'rb');

$size = filesize($file); // File size
$length = $size; // Content length
$start = 0; // Start byte
$end = $size - 1; // End byte

header("Accept-Ranges: 0-$length");
if (isset($_SERVER['HTTP_RANGE'])) {

$c_start = $start;
$c_end = $end;
// Extract the range string
list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
// Make sure the client hasn't sent us a multibyte range
if (strpos($range, ',') !== false) {
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
exit;
}
header("X-Got-Range: $range, $range0");
// If the range starts with an '-' we start from the beginning
// If not, we forward the file pointer
// And make sure to get the end byte if spesified
if ($range0 == '-') {
$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;
}

// End bytes can not be larger than $end.
$c_end = ($c_end > $end) ? $end : $c_end;
// Validate the requested range and return an error if it's not correct.
if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size) {

header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
// (?) Echo some info to the client?
exit;
}
$start = $c_start;
$end = $c_end;
$length = $end - $start + 1; // Calculate new content length
fseek($fp, $start);
header('HTTP/1.1 206 Partial Content');
}

// Notify the client the byte range we'll be outputting
header("Content-Range: bytes $start-$end/$size");
header("Content-Length: $length");

// Start buffered download
$buffer = 1024 * 8;
while(!feof($fp) && ($p = ftell($fp)) <= $end) {

if ($p + $buffer > $end) {

// In case we're only outputtin a chunk, make sure we don't
// read past the length
$buffer = $end - $p + 1;
}
set_time_limit(0); // Reset time limit for big files
echo fread($fp, $buffer);
flush(); // Free up memory. Otherwise large files will trigger PHP's memory limit.
}

fclose($fp);
}

我正在通过 PHP 传递视频,因为文件应该仅在登录时可见。我用部分内容/范围来做这些事情,因为我希望能够在位置栏的中间单击,视频应该从那里开始播放。

这一切都适用于 Chrome、较新的 Safari、iOS,但(由于 Flash 回退)在 IE 或 Firefox 中不起作用(视频是 mp4)(也许加载时间太长)

范围在 Chrome 中有效,但是 VideoJS 的 Flash 版本甚至不要求范围下载,因此它获得了另一个版本。

如果我在 Firefox 中直接播放视频(使用 PHP 流,但没有 VideoJS)(只需在 URL 栏中调用视频 URL),它会直接启动并在播放时加载; VideoJS 没有

我需要更改什么才能让视频在 VideoJS Flash 版本中直接开始播放?

最佳答案

我找到了解决方案(偶然 ;-) )

问题是,Flash-Player 要求将视频作为完整文件。只要服务器不回答,即有可用的流媒体版本(接受范围:0-$size),玩家就不会要求它们。

所以我设置了页眉并且它起作用了。

所有有 VideoJS Flash 回退问题的小教程:

  • 视频需要通过 MP4Box 编码(参见 MP4 in Video.js not playing until fully loaded )
  • PHP 直通脚本需要发送以下 header :

    header("内容类型:$videoMimeType");header("内容长度:$videoByteCount");header("Accept-Ranges: 0-$videoByteCount");

  • 如果您想处理范围(由 isset($_SERVER["HTTP_RANGE"]) 标识),您还需要指定这些 header :

    header("Content-Range: bytes $startByte-$endByte/$videoByteCount");

这对我有用(请参阅我的问题中的代码)。它适用于带有 Flash 的 Chrome、FF、iOS、Safari(IE 尚未测试)和带有 mp4 文件的 HTML5

关于php - VideoJS Flash 版本不播放文件(PHP 直通流),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17708898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com