我们有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 回答
问题
传统上,您将提供一个播放列表文件,该文件将由您的浏览器保存,然后在配置为打开此类播放列表的任何播放器软件中打开 . 然后,播放器将读取流的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实例,每个实例也会连接到你的服务器 . 这不是理想的,但根据您的可用情况,可能是您的唯一方法 .