gpt4 book ai didi

iphone - 使用 CakePHP 的媒体 View 将视频提供给 iPad/iPhone

转载 作者:行者123 更新时间:2023-12-03 19:54:17 26 4
gpt4 key购买 nike

我正在 LAMP 环境中开发 CakePHP 1.3 项目,我们在 /app/webroot/ 之外存储了许多视频。并使用 CakePHP's Media Views 提供它们(我们这样做是因为我们不希望直接访问这些文件)。但是,我无法通过媒体 View 将这些视频提供给 iOS 设备(例如 iPhone、iPad)。

我可以将测试视频放置在 /app/webroot/ 内的某个位置并直接在 iOS 设备上访问它并且播放按预期进行,所以我很确定这不是 MOOV 问题或视频本身的其他编码问题。据我所知,这与 CakePHP 对 iOS 设备在加载视频时使用的字节范围请求的处理(或缺乏处理)有关。

我找到了one other Stack Overflow ticket不幸的是,这个问题没有得到答复,但详细说明了类似的问题。看着/cake/libs/view/media.php class 文件中, render() 中有一个 if 语句在检查 $_SERVER['HTTP_RANGE'] 时提示的方法值(value);但据我在测试中所知,这个值从未被设置(至少在 CakePHP 查找它时没有)。上述票证中链接的异地解决方案并不能解决我的问题,因为它也依赖于对该值的检查,我已经验证在媒体 View 类本身或 Controller 中检查时没有找到该值。设置所述 View 。

那么,有没有人有过使用 CakePHP 媒体 View 向 iOS 设备提供视频的运气或经验?提前致谢!

最佳答案

在我在网络上发布的各种问题没有得到解答后,我们再次尝试解决这个问题并找到了答案。

事实证明,这是 Media.php 类文件 (/cake/libs/view/media.php) 中的一个问题,它对 HTTP_RANGE header 值的期望以及它如何格式化后续内容 header 。首先,这是原始的相关代码片段:

$httpRange = env('HTTP_RANGE');
if (isset($httpRange)) {
list($toss, $range) = explode('=', $httpRange);

$size = $fileSize - 1;
$length = $fileSize - $range;

$this->_header(array(
'HTTP/1.1 206 Partial Content',
'Content-Length: ' . $length,
'Content-Range: bytes ' . $range . $size . '/' . $fileSize));

fseek($handle, $range);
}

请注意 list() 调用,它会填充一个 $range 值,然后将其用作数字。然而,在进一步调试 header 调用后,我们注意到 HTTP_RANGE 值实际上以 Range: bytes=0-1000 形式给出,其中给定的数字范围取决于请求。我们进行了以下更改(并在媒体 View 调用中将下载 bool 值设置为 true),瞧,iOS 设备上的工作视频。

$httpRange = env('HTTP_RANGE');
if (isset($httpRange)) {
$start = 0; //start byte
$end = $fileSize - 1; //end byte
$length = $fileSize; //content length

$c_start = $start; //default value
$c_end = $end; //default value
list($toss, $range) = explode('=', $httpRange); //extract range

//grab range value(s)
if ($range[0] == '-') {
$c_start = $fileSize - substr($range, 1);
} else {
$range = explode('-', $range);
$c_start = $range[0];
$c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $fileSize;
}

//validate end byte
$c_end = ($c_end > $end) ? $end : $c_end;

//set new values
$start = $c_start;
$end = $c_end;
$length = $end - $start + 1;

$this->_header(array(
'HTTP/1.1 206 Partial Content',
'Content-Length: ' . $length,
'Content-Range: bytes ' . $start . '-' . $end . '/' . $fileSize));
fseek($handle, $start);
}

请注意,这包含 this article 附录 A 中的大部分逻辑。 ,处理各种情况。 (最初我们避开了大部分这种逻辑,虽然播放效果很好,但一旦在 iOS 设备上到达文件末尾,它似乎表现得有点不稳定。)

关于iphone - 使用 CakePHP 的媒体 View 将视频提供给 iPad/iPhone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13385426/

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