首页 文章

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

提问于
浏览
3

我们有shoutcast / icecast音频流 . 我已经看过这个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上,它说“抱歉,这个播放器不支持这种类型的音频文件”


Update 2:

删除 "Transfer-Encoding" 将在Android上播放,但由于实时流没有"Content-Length",通常需要很长时间才能开始流"Preparing"状态

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

引用布拉德:

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

注意到虽然它适用于Android,但大多数直播流将需要花费大量时间才能开始 .

1 回答

  • 5

    问题

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

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

    解决方案

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

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

    • 使用分块传输编码 . 您可以通过设置以下标头来完成此操作:
      Transfer-Encoding: chunked
      然后,使用chunked编码为流,你很高兴 .

    • 不使用传输编码,并指定在资源传输完成后关闭连接,并使用以下标头:
      Transfer-Encoding: none
      Connection: close

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

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

    实施

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

相关问题