Php <;音频>;带有控件的元素';轨迹栏不移动

Php <;音频>;带有控件的元素';轨迹栏不移动,php,html,audio,html5-audio,Php,Html,Audio,Html5 Audio,我有一个尝试设置内容长度标题 header("Content-Length: " . filesize($filename)); 由于某些原因,如果事先没有这些信息,它就无法进行必要的数学运算来放置轨迹栏。我的经验 你的代码没有问题。我曾经有过这个问题。。这是您发现的Firefox和Content Length上的一个简单缓存问题 c.php <audio controls="controls" id="audio-sample" preload="auto"> <s

我有一个

尝试设置
内容长度
标题

header("Content-Length: " . filesize($filename));
由于某些原因,如果事先没有这些信息,它就无法进行必要的数学运算来放置轨迹栏。

我的经验 你的代码没有问题。我曾经有过这个问题。。这是您发现的
Firefox
Content Length
上的一个简单缓存问题

c.php

<audio controls="controls" id="audio-sample" preload="auto">
    <source src="a.php?type=ogg&id=0" type="audio/ogg" />
    <source src="a.php?type=mp3&id=1" type="audio/mp3" />
</audio>
$id = intval($_GET['id']);
$files = array(0 => "audio.ogg",1 => "audio.mp3");
$filename = $files[$id];

header('Content-Type: ' . mime_content_type($filename));
header("Content-transfer-encoding: binary");
header("Content-Length: " . filesize($filename));

ob_clean();
flush();
readfile($filename);
exit();
在Firefox中,
100%
,但当我将
readfile($filename)
更改为

  readfile("SIMPLE ERROR ERROR");
Firefox sill为我支付音频费用,而不是不支付任何文件。唯一让它意识到错误的方法是在
src
文件中添加一个随机字符串

<source src="a.php?type=ogg&id=0&<?php echo mt_rand(); ?>" type="audio/ogg" />
                                             ^---- rand string

让它在Firefox和Safari上运行的诀窍就是发送一个
内容范围
标题


Content-Type=audio/ogg
Content-Length
Accept-Ranges=bytes
,以及的组合最重要的是,我认为
X-Content-Duration
响应头对我起作用

X-Content-Duration
头告诉客户端ogg文件的持续时间(以秒为单位)。这里有更多的信息


ogg文件的每一帧都可能用可变位数编码,因此仅知道以字节为单位的文件大小并不能告诉您以秒为单位的文件长度。对于带有
X-Content-Duration
头的ogg vorbis文件,您可以明确地告诉客户这一点。

仅通过
readfile()
显式发送文件内容有什么好处?@alex:没有,我不知道
readfile
存在。谢谢(我现在就试试
内容长度
这件事。我认为它以前不管用,但谁知道呢!)@alex:
内容长度
工作得很好。啊,对不起!请将此作为回答:)事实上,尽管你仍然可以在Firefox上搜索(在已经播放过的区域中),但轨迹拇指开始并停留在条的末端。有什么想法吗?@minitech我不确定抱歉,我没有太多地使用
音频元素。我来看看,因为Apache正在用传输编码替换内容长度头:chunked;我无法使搜索栏工作。有什么办法可以解决这个问题吗?谢谢,这确实是其中的一部分!但现在它显示了当前相对于缓冲区的位置,它似乎不想预先缓冲所有的数据,只需要大约一秒钟。有什么想法吗?Firefox只有缓存音频文件的有效相对位置。。。如果您第二次播放音频,您会注意到相对位置变得固定。。。解决方案删除mt_rand,您就没事了……我没有为测试添加随机数-它仍然只显示相对于前五秒左右的位置。@minitech。。。在第二次播放音频后,它是否也这样做?使用不带PHP的
,并检查它是否这样做。。你使用的是什么版本的firefox?我刚刚看到了这个,它看起来像
header('Accept-Ranges:bytes')为我解决了问题!我是从你关于这个问题的问题中得出这个结论的。显然,所有用户代理中都存在一些实现问题:(
  readfile("SIMPLE ERROR ERROR");
<source src="a.php?type=ogg&id=0&<?php echo mt_rand(); ?>" type="audio/ogg" />
                                             ^---- rand string
$length = filesize($filename);

header('Content-Type: ' . $mimetype[$type]);
header('Content-Length: ' . $length);
header('Content-Range: bytes 0-' . ($length - 1) . '/' . $length);

readfile($filename);