我正在尝试从RAR存档中传输视频内容。
并且在第一秒就可以了,但问题是该流不支持fseek,因此客户端无法请求更多数据或在视频中搜索。
(http://www.php.net/manual/en/rarentry.getstream.php)
是否有可能让这个想法奏效?
<?php
// Report all PHP errors
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Open rar archive
$rar_file = rar_open('test.rar');
if ($rar_file === false)
die("Failed to open Rar archive");
// Get video file in archive
$entry = rar_entry_get($rar_file, 'video.mkv');
if ($entry === false)
die("Failed to find such entry");
header('Content-Type: application/octet-stream');
header('Content-Disposition: inline; filename="video.mkv"');
// Seek
$seek_start = 0;
$seek_end = -1;
$fs = $entry->getPackedSize();
if (isset($_SERVER['HTTP_RANGE']) || isset($HTTP_SERVER_VARS['HTTP_RANGE'])) {
$seek_range = isset($HTTP_SERVER_VARS['HTTP_RANGE']) ? substr($HTTP_SERVER_VARS['HTTP_RANGE'], strlen('bytes=')) : substr($_SERVER['HTTP_RANGE'], strlen('bytes='));
$range = explode('-', $seek_range);
if ($range[0] > 0) {
$seek_start = intval($range[0]);
}
$seek_end = ($range[1] > 0) ? intval($range[1]) : -1;
header('HTTP/1.0 206 Partial Content');
header('Status: 206 Partial Content');
header('Accept-Ranges: bytes');
header("Content-Range: bytes $seek_start-$seek_end/" . $fs);
}
if ($seek_end < $seek_start) {
$seek_end = $fs - 1;
}
$cl = $seek_end - $seek_start + 1;
header('Content-Length: ' . $cl);
ob_flush();
// Get file stream
$stream = $entry->getStream();
rar_close($rar_file); //stream is independent from file
if ($stream === false)
die("Failed to obtain stream.");
fseek($stream, $seek_start);
// Start stream
while (!feof($stream)) {
set_time_limit(0);
print(fread($stream, 8192));
flush();
ob_flush();
}
fclose($stream);
?>
答案 0 :(得分:1)
我后来发现PHP中的rar档案不支持fseek,因为没有实现。 你可以在python中轻松完成这个,这就是为什么我想尝试PHP。
答案 1 :(得分:0)
网络上常用的视频格式是高度压缩的。你节省的空间很小,但增加了复杂性。我无法从你的代码中看出这是否是问题,但是一种经过验证的工程调试技术是将系统缩减到最基本的形式,让它运行起来,然后才增加复杂性(例如.rar存档文件,这些文件具有可疑价值。)