首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTML5 <audio> Safari实时直播与非直播

HTML5 <audio> Safari实时直播与非直播
EN

Stack Overflow用户
提问于 2010-01-04 01:19:26
回答 5查看 21K关注 0票数 37

我正在尝试嵌入一个指向MP3或OGG数据的HTML5音频元素。当我在Safari中查看页面时,控件会出现,但UI显示"Live Broadcast“。当我单击播放时,音频按预期开始播放。但是,一旦结束,我就不能通过单击播放来重新开始播放。即使在音频元素上使用JS并将currentTime设置为0也会失败,并出现索引错误异常。

我怀疑PHP脚本中的头文件才是问题所在,特别是缺少内容长度。但事实并非如此。响应报头包括适当的Content- Length,以指示音频的大小有限。此外,在火狐3.5+中,一切都按预期运行。我可以多次单击audio元素上的play来收听声音回放。

如果我从等式中删除PHP脚本,并提供MP3文件的静态副本,那么在Safari中一切都可以正常工作。

这是否意味着Safari对待带有查询参数的音频src URL的方式不同于没有这些参数的URL?有没有人能让这个工作起来?

我的简单示例页面是:

代码语言:javascript
复制
<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <audio controls autobuffer>
      <source src="say.php?text=this%20is%20a%20test&format=.ogg" />
      <source src="say.php?text=this%20is%20a%20test&format=.mp3" />
    </audio>
  </body>
</html>

来自PHP脚本的HTTP标头:

代码语言:javascript
复制
HTTP/1.x 200 OK
Date: Sun, 03 Jan 2010 15:39:34 GMT
Server: Apache
X-Powered-By: PHP/5.2.10
Content-Length: 8993
Keep-Alive: timeout=2, max=98
Connection: Keep-Alive
Content-Type: audio/mpeg

来自直接文件访问的HTTP标头:

代码语言:javascript
复制
HTTP/1.x 200 OK
Date: Sun, 03 Jan 2010 20:06:59 GMT
Server: Apache
Last-Modified: Sun, 03 Jan 2010 03:20:02 GMT
Etag: "a404b-c3f-47c3a14937c80"
Accept-Ranges: bytes
Content-Length: 8993
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: audio/mpeg

我也尝试过将Accept-Ranges头硬编码到脚本中,但没有成功。

EN

回答 5

Stack Overflow用户

发布于 2011-12-12 04:19:03

根据记录,虽然波昌和克里斯都正确地认为你需要内容范围头来解决Safari中的这个问题,但Chrome需要一个额外的头来设置currentTime才能正常工作:

代码语言:javascript
复制
header( 'Accept-Ranges: bytes');

请注意,您实际上不必正确响应请求的Range标头,只需在响应中包含此内容即可。

票数 4
EN

Stack Overflow用户

发布于 2019-11-19 18:44:59

老话题,但在2019年仍然有效。我们终于找到了解决方案。下面的PHP脚本示例将考虑Safari的"Range“头请求。

代码语言:javascript
复制
$bytes_total = strlen($data);
if (isset($_SERVER['HTTP_RANGE'])) {
    $byte_range = explode('-',trim(str_ireplace('bytes=','',$_SERVER['HTTP_RANGE'])));
    $byte_from = $byte_range[0];
    $byte_to = ($byte_range[1]+1);
    $data = substr($data,$byte_from,$byte_to);
    header('HTTP/1.1 206 Partial Content');
}
else {
    $byte_from = 0;
    $byte_to = $bytes_total;
}
$length = strlen($data); 
header('Content-type: '.$content_type);
header('Accept-Ranges: bytes');
header('Content-length: ' . $length);
header('Content-Range: bytes '.$byte_from.'-'.$byte_to.'/'.$bytes_total);
header('Content-Transfer-Encoding: binary');
print($data);
票数 4
EN

Stack Overflow用户

发布于 2010-05-15 16:17:06

我也有同样的问题。关键点是Content-Range头。在我把它添加到mp3-output php之后,一切都运行得很好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1995589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档