【问题标题】:HTML5 audio with PHP script does not work on iPad/Iphone带有 PHP 脚本的 HTML5 音频在 iPad/Iphone 上不起作用
【发布时间】:2011-02-26 02:50:05
【问题描述】:

好的,我正在尝试在 iPad 上播放 HTML 音频代码,但不起作用。

我创建了一个 PHP 脚本来发送对 HTML5 音频代码的 MP3 请求

mp3_file_player.php?n=mp3file.mp3

播放器在这里: http://www.avault.com/news/podcast-news/john-romero-podcast-episode-80/

您将看到它在每个支持 HTML5 的浏览器上都可以使用,即使在我的 iPod Touch 上也是如此。但不能在 iPad/iPhone 上运行,甚至在 Mac OSX 上的 Safari 上也不能运行(我在 Safari/Windows 上试过,运行良好)

这是我的 PHP 代码:

header("X-Powered-By: ");
header("Accept-Ranges: bytes");
header("Content-Length: ". (string)(filesize($episode_filename)) ."");
header("Content-type: audio/mpeg");
readfile($episode_filename);
exit();

一切正常,MP3 的标题与直接阅读 mp3 相同。

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

(Status-Line) HTTP/1.1 200 OK
Date Mon, 31 May 2010 20:27:31 GMT
Server Apache/2.2.9
Last-Modified Wed, 26 May 2010 13:39:19 GMT
Etag "dac0039-41d91f8-4877f669cefc0"
Accept-Ranges bytes
Content-Length 50656162
Content-Range bytes 18390614-69046775/69046776
Keep-Alive timeout=15, max=100
Connection Keep-Alive
Content-Type audio/mpeg

我的 PHP 脚本中的 HTTP 标头:

(Status-Line) HTTP/1.1 200 OK
Date Mon, 31 May 2010 20:27:08 GMT
Server Apache/2.2.9
Accept-Ranges bytes
Content-Length 69046776
Keep-Alive timeout=15, max=100
Connection Keep-Alive
Content-Type audio/mpeg

唯一不同的是 Content-Range,我什至尝试添加它,但如果我使用它,播放器将无法在我的 Ipod Touch 上运行。所以我删除了。

非常感谢。

【问题讨论】:

  • 在 Mac OS X 上的最新 Webkit 版本中运行良好(尽管它改为“直播”)。
  • 直播对我来说真的把 safari 搞得一团糟。

标签: php audio ipad safari html


【解决方案1】:

我正在为音乐播放器提供 mp3。我有类似的标题。在 ipad 上播放了一些 mp3。其他人没有。

我发现这篇文章解决了我的问题。 http://mobiforge.com/developing/story/content-delivery-mobile-devices 基本上,Apple iPhone 使用 HTTP 字节范围来请求音频和视频文件。

我的标题是:

header("X-Powered-By: ");
header('Content-Length: '. (string)filesize($path)); // provide file size
header('Content-type: audio/mpeg');

if(isset($_SERVER['HTTP_RANGE']))  { // any device that supports byte-ranges
 rangeDownload($path); // function from article mentioned above
}

$fp = fopen($_SERVER["SCRIPT_FILENAME"], "r");
$etag = md5(serialize(fstat($fp))); 
fclose($fp); 
header('Etag: '.$etag); 
readfile($path);

【讨论】:

    【解决方案2】:

    尝试删除header("Accept-Ranges: bytes");,因为您没有发送文件的一部分。 删除 header("X-Powered-By: ");,因为 Apache 无论如何都会提供服务

    $etag = md5(serialize(fstat($fp))); 
    fclose($fp); 
    header('Etag: '.$etag); 
    

    ^^ 添加电子标签

    试一试!

    【讨论】:

    • 谢谢,我都改了,试试看效果。但是您的$etag 缺少$fp,我在网上找到了它: $fp = fopen($_SERVER["SCRIPT_FILENAME"], "r");正确的?谢谢。我刚刚实现,打算请有 iPad 的朋友测试一下。
    • 罗伯特皮特,就是这样。我删除了 Accept-Ranges 并添加了 Etag,我没有删除 X-Powered。但它奏效了。现在一切都很顺利。谢谢。
    • ETag 不需要,尤其是当您没有实现缓存验证时。
    【解决方案3】:

    Content-Range 仅对状态 206 有效。

    您的代码似乎根本不支持部分请求(您必须相应地解析 Range 标头并将响应正文拼接在一起,而 Content-Length = filesize($episode_filename) 在几乎所有情况下都是无效的)。

    如果您不打算在 HTTP 服务器中实现 HTTP 服务器,让 Apache 为 MP3 提供服务。

    如果您需要在 PHP 中实现访问控制,请查看 X-Sendfile 扩展名或使用无法猜测的文件名创建符号链接并在那里重定向客户端。

    如果您真的想以艰难的方式进行 HTTP 部分下载,请阅读 RFC 2616 或查找可以为您完成所有工作的库。 不要盲目地发送你找到的任何 HTTP 标头。

    【讨论】:

      猜你喜欢
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多