使用php在android上打开实时音频流


Using php to opening live audio stream on android

我们有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响应标头。对于流媒体,长度未知。有两种方法可以解决这个问题:

  1. 使用分块传输编码。您可以通过设置以下标头来做到这一点:
    Transfer-Encoding: chunked
    然后,对流使用分块编码,就可以开始了
  2. 不使用传输编码,并指定在资源传输完成时关闭连接,使用以下标头:
    Transfer-Encoding: none
    Connection: close

您的示例链接使用方法一。我也成功地使用了方法二。

一旦你的服务器正在使用有效的HTTP,在Android上播放似乎就轻而易举了。

实施

有几种方法可以实现此修复。您提到了一个PHP解决方案。如果cURL不起作用,您可以始终使用fsockopen()stream_socket_client()来建立直接的TCP连接,并自己处理传入的流数据。从那里,你只需要发送正确的响应头,并在数据到达时中继数据。请记住,每个连接的客户端都会运行一个PHP实例,每个实例也会连接到你的服务器。这并不理想,但根据你现有的情况,这可能是你唯一的方法。