如何获得视频部分的大小?我希望获得视频一分钟的大小。这可能吗?
我正在制作一个php视频流脚本,我意识到你不能跳过前进。这就是我打算做的事情:如果用户向前跳过一分钟,我会计算视频一分钟的大小。然后我回应了视频,但跳过了第一分钟。
这是我目前的代码:
function readfile_chunked($filename, $retbytes = TRUE) {
$buffer = "";
$cnt = 0;
$handle = fopen($filename, 'rb');
if ($handle === false) {
return false;
}
while (!feof($handle)) {
$buffer = fread($handle, CHUNK_SIZE);
echo $buffer;
ob_flush();
flush();
if ($retbytes) {
$cnt += strlen($buffer);
}
}
$status = fclose($handle);
if ($retbytes && $status) {
return $cnt; // return num. bytes delivered like readfile() does.
}
return $status;
}
我还有一个内容类型的标题,我没有在上面的代码中包含。
感谢您的帮助!
答案 0 :(得分:1)
它不是"跳过"已经完成了。
您应该做的是查找将由播放器发送的HTTP_RANGE标头。
在PHP中,您需要添加然后处理header('Accept-Ranges: bytes');
标题。
因此,当用户点击在视频中向前跳过时,播放器会向服务器发送$_SERVER['HTTP_RANGE']
,然后您可以使用它来搜索文件的一部分以进行输出。
以下是示例(未经测试):
<?php
...
...
//check if http_range is sent by browser (or download manager)
if(isset($_SERVER['HTTP_RANGE'])){
list($size_unit, $range_orig) = explode('=', $_SERVER['HTTP_RANGE'], 2);
if ($size_unit == 'bytes'){
//multiple ranges could be specified at the same time, but for simplicity only serve the first range
//http://tools.ietf.org/id/draft-ietf-http-range-retrieval-00.txt
list($range, $extra_ranges) = explode(',', $range_orig, 2);
}else{
$range = '';
header('HTTP/1.1 416 Requested Range Not Satisfiable');
exit;
}
}else{
$range = '';
}
//figure out download piece from range (if set)
list($seek_start, $seek_end) = explode('-', $range, 2);
//set start and end based on range (if set), else set defaults
//also check for invalid ranges.
$seek_end = (empty($seek_end)) ? ($file_size - 1) : min(abs(intval($seek_end)),($file_size - 1));
$seek_start = (empty($seek_start) || $seek_end < abs(intval($seek_start))) ? 0 : max(abs(intval($seek_start)),0);
//Only send partial content header if downloading a piece of the file (IE workaround)
if ($seek_start > 0 || $seek_end < ($file_size - 1)){
header('HTTP/1.1 206 Partial Content');
header('Content-Range: bytes '.$seek_start.'-'.$seek_end.'/'.$file_size);
header('Content-Length: '.($seek_end - $seek_start + 1));
}else{
header("Content-Length: $file_size");
}
header('Accept-Ranges: bytes');
...
...
?>
还有一个问题here you may find usefull,它将更容易实现。