我们有shoutcast/icecast音频流。我希望能够在我们的网站上提供一个链接,比如mobiledroid.php,它将使用默认播放器打开。我在另一个网站上看到过这样做,所以我知道这是可能的。
我假设它使用php头和通过php文件的流作为流?
根据Brad的指示,android实际上提供了使用声音播放器打开的选项。不错。
它也通过PC在WMP上播放,但不在android上播放上述链接如何播放
header("Content-type: audio/mpeg");
header("Transfer-Encoding: chunked");
header("Connection: close");
$sock = fsockopen($streamname,$port); //$streamname is the IP
fputs($sock, "GET $path HTTP/1.0'r'n"); //path in my case is /;stream.mp3
fputs($sock, "Host: $ip'r'n");
fputs($sock, "User-Agent: WinampMPEG/2.8'r'n");
fputs($sock, "Accept: */*'r'n");
fputs($sock, "Icy-MetaData:1'r'n");
fputs($sock, "Connection: close'r'n'r'n");
fpassthru($sock);
fclose($sock);
在安卓系统上,它说";抱歉,此播放器不支持这种类型的音频文件"
更新2:
删除CCD_ 1将在android上播放,但像往常一样;准备";由于直播流不具有"状态";"内容长度";
header("Transfer-Encoding: none");
也从上述代码中删除:
引用Brad:
Android 2.3和更高版本具有传输编码设置为"0"的问题;没有";。删除该硬集标头将使流返回到分块传输编码。这适用于Android 2.3+。最初我禁用了分块编码,因为VLC不支持它。看起来Android 2.2及更旧版本不支持分块编码。
这里要注意的是,尽管它在安卓系统上运行,但大多数直播都需要很长时间才能开始。
问题
传统上,您会提供一个播放列表文件,该文件将由浏览器保存,然后在任何配置为打开此类播放列表的播放器软件中打开。然后,播放器将读取流的URL,连接到它,并开始流式传输。
在安卓系统上,他们(出于某种疯狂的原因)选择不支持播放列表文件作为支持的媒体。正因为如此,使用传统方法无法直接启动玩家。
解决方案
在Android上,如果你直接链接到MP3文件/流,而不是下载文件,默认操作是打开媒体播放器并尝试流式传输。这意味着你可以轻松地直接链接到流的URL(完全绕过播放列表步骤)。
有一个陷阱。。。SHOUTcast提供的流并不完全符合HTTP。它们很接近,但并不完美。这里真正的问题似乎是内容长度问题。通常,HTTP服务器发送Content-Length
响应标头。对于流媒体,长度未知。有两种方法可以解决这个问题:
- 使用分块传输编码。您可以通过设置以下标头来做到这一点:
Transfer-Encoding: chunked
然后,对流使用分块编码,就可以开始了 - 不使用传输编码,并指定在资源传输完成时关闭连接,使用以下标头:
Transfer-Encoding: none
Connection: close
您的示例链接使用方法一。我也成功地使用了方法二。
一旦你的服务器正在使用有效的HTTP,在Android上播放似乎就轻而易举了。
实施
有几种方法可以实现此修复。您提到了一个PHP解决方案。如果cURL不起作用,您可以始终使用fsockopen()
或stream_socket_client()
来建立直接的TCP连接,并自己处理传入的流数据。从那里,你只需要发送正确的响应头,并在数据到达时中继数据。请记住,每个连接的客户端都会运行一个PHP实例,每个实例也会连接到你的服务器。这并不理想,但根据你现有的情况,这可能是你唯一的方法。