videoJS - 在没有完全加载视频的情况下播放

时间:2015-03-22 00:15:16

标签: php video.js

我有一个php文件,我在那里下载各方的flv文件,如:

header('Accept-Ranges: bytes');
header('Content-Type: '.$mime_type);
header('Connection: keep-alive');
header ("Content-Length: " . $length);
header('Content-Transfer-Encoding: binary');
header ("Content-Disposition: attachment; filename=file.flv");

$fd = fopen($url, "r");
while(!feof($fd))
{
    echo fread($fd, 4096);
    ob_flush();
}

然后使用videoJS在我的网页上播放此视频:

<body>
    <video id="video1" class="video-js vjs-default-skin" poster="http://video-js.zencoder.com/oceans-clip.png" width="640" height="480"
        data-setup='{"loadingSpinner": false, "controls" : true, "autoplay" : true, "preload" : "auto"}'>
        <source src="videos.php" type="video/x-flv">
    </video>
</body>

但是当我滚动时间显示视频:1:12:14时,时间计数器停止,视频显示在00:03:14(但指针仍在1:12:14)。

我想修复此错误 - 如果文件未加载到1:12:14 - 播放器应阻止更改时间显示。

我怎么做?

1 个答案:

答案 0 :(得分:1)

当您使用视频播放器快速点击时,浏览器将取消现有请求,并仅对部分 文件。 &#34;范围&#34;标头出现在这个新请求中。在这种情况下,服务器必须使用状态代码206进行响应 (部分内容)并包含&#34;内容范围&#34;报头中。

if (isset($_SERVER['HTTP_RANGE']))
{
  // extract the range string
  list ($units, $range) = explode ("=", $_SERVER['HTTP_RANGE']);
  list ($firstByte, $lastByte) = explode ("-", $range);
  $length = $lastByte - $firstByte + 1; // Calculate a new content length
  // seek forward on the file
  fseek ($fd, $firstByte);

  // headers to return for partial content
  header ("HTTP/1.1 206 Partial Content");
  header ("Content-Range: bytes $firstByte-$lastByte/$size");
  header ("Content-Length: $length");
}

参见&#34; 14.35范围&#34;在:    http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html