gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:03 27 4
gpt4 key购买 nike

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

我假设它通过 php 文件使用 php header 和流作为流?


根据 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:

删除 “Transfer-Encoding” 将在 android 上播放,但由于直播没有“Content-Length”,通常需要很长时间才能以“Preparing”状态开始流媒体

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

引用布拉德的话:

Android 2.3 and later has an issue with Transfer-Encoding set to "none". Removing that hard-set header puts the stream back to chunked Transfer-Encoding. This works great for Android 2.3+. Originally I had disabled chunked encoding as VLC doesn't support it. It also seems that Android 2.2 and older does not support chunked encoding.

请注意,虽然它适用于 android 设备,但大多数直播流需要很长时间才能开始。

最佳答案

问题

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

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

解决方案

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

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

  1. 使用分块传输编码。您可以通过设置以下 header 来完成此操作:
    Transfer-Encoding: chunked
    然后,对流使用分块编码,一切顺利。
  2. 不使用传输编码,并指定在资源传输完成时关闭连接,使用这些 header :
    Transfer-Encoding: none
    连接:关闭

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

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

实现

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

关于php - 使用 php 在 android 上打开实时音频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11472997/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com