3

我有一个<audio>带有这样控件的元素:

<audio controls="controls" id="audio-sample" preload="auto">
    <source src="../../music-sample.php?type=ogg&amp;id=<?php echo $item->custom_5; ?>" type="audio/ogg" />
    <source src="../../music-sample.php?type=mp3&amp;id=<?php echo $item->custom_5; ?>" type="audio/mp3" />
</audio>

播放器出现了,声音播放得很好,但是轨迹栏没有移动以反映经过的时间,也不能拖动它来寻找。为什么不?我需要发送某种额外的标题吗?这是所有相关的 PHP,没什么特别的:

header('Content-Type: ' . $mimetype[$type]);

$file = fopen($filename, 'rb');
fpassthru($file);
fclose($file);
exit();

你可以在这里看到问题。

4

4 回答 4

4

尝试设置Content-Length标题...

header("Content-Length: " . filesize($filename));

出于某种原因,如果没有预先提供这些信息,它就无法进行必要的数学运算来放置轨迹栏。

于 2012-11-01T04:46:31.007 回答
2

让它在 Firefox 和 Safari 上运行的技巧是发送一个Content-Range标头,如此处所述

$length = filesize($filename);

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

readfile($filename);
于 2012-11-09T22:18:49.587 回答
1

, Content-Type = audio/ogg,和最重要的是Content-Length,我认为响应标头对我有用。Accept-Ranges = bytesX-Content-Duration

X-Content-Duration头告诉客户端 ogg 文件的持续时间(以秒为单位)。这是有关它的更多信息https://developer.mozilla.org/en-US/docs/Configuring_servers_for_Ogg_media

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

于 2012-11-09T22:30:42.663 回答
1

我的经验

您的代码没有任何问题。我曾经遇到过这个问题,而且..这是一个简单的缓存问题FirefoxContent-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>

a.php

$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();

100%在 Firefox 中有效,但是当我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

这种方式请求 URL Firefox 立即停止播放音频

问题

因为您之前尝试过流式传输内容,Zero Content-Length这仍然是您的音频不付费的原因...... Firefox 已经缓存了最初的无效内容

解决方案

清除所有缓存..在代码上方使用以下代码应该可以正常工作,或者只需在代码中添加 rand 参数进行测试

在此处输入图像描述

无效的相对位置

永久使用mt_rand()会导致难以Firefox缓存音频文件,从而导致无效的相对解决方案。

清除mt_rand缓存后删除,这将得到修复

于 2012-11-09T13:58:34.857 回答