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

时间:2012-07-13 14:56:47

标签: php android shoutcast

我们有shoutcast / icecast音频流。我希望能够在我们的网站上提供一个名为mobiledroid.php的链接,该链接将使用默认播放器打开。我见过这个done on another site所以我知道这是可能的。

我认为它通过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);

在Android上,它说“对不起,这个播放器不支持这种类型的音频文件”


更新2:

删除"Transfer-Encoding"将在Android上播放,但由于实时流不具有“内容长度”,通常需要很长时间才能以“准备”状态开始播放

header("Transfer-Encoding: none");也从上面的代码中删除了:

引用布拉德:

  

Android 2.3及更高版本存在Transfer-Encoding设置为“none”的问题。删除该硬集头会将流返回到分块的Transfer-Encoding。这适用于Android 2.3+。最初我禁用了分块编码,因为VLC不支持它。似乎Android 2.2及更早版本不支持分块编码。

请注意,尽管它适用于Android,但大多数直播流程都需要花费大量时间才能开始。

1 个答案:

答案 0 :(得分:5)

问题

传统上,您将提供一个播放列表文件,该文件将由您的浏览器保存,然后在配置为打开此类播放列表的任何播放器软件中打开。然后播放器将读取流的URL,连接到它,然后开始流式传输。

在Android上,他们(出于某种疯狂的原因)选择不支持播放列表文件作为支持的媒体。因此,没有直接的方法来使用传统方法启动播放器。

解决方案

在Android上,似乎如果您直接链接到MP3文件/流,而不是下载文件,默认操作是打开媒体播放器并尝试流式传输。这意味着您可以轻松直接链接到流的URL(完全绕过播放列表步骤)。

有一个捕获...与SHOUTcast一起提供的流不完全符合HTTP标准。它们很接近,但并不完美。这里真正的挂起似乎是内容长度之一。通常,HTTP服务器会发送Content-Length响应标头。使用流媒体,长度未知。有两种解决问题的方法:

  1. 使用分块传输编码。您可以通过设置以下标题来执行此操作:
    Transfer-Encoding: chunked
    然后,对流使用分块编码,您就可以了。
  2. 不使用传输编码,并指定在资源传输完成后关闭连接,并使用这些标头:
    Transfer-Encoding: none
    Connection: close
  3. 您的示例链接使用方法一。我也成功地使用了方法二。

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

    实施

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