7

MediaPlayer从 HTTP URL 流式传输时,我无法保持弹性。

如果我开始播放文件,但随后断开连接(例如飞行模式),则MediaPlayer#OnErrorListener生成what=1, extra=-17然后不久之后what=-38, extra=0

我在 API 中没有看到关于 this 表示什么的文档,除了额外的是“通常依赖于实现”。我正在使用 HTC Hero(嗯,它是 T-Mobile UK 的 G2 Touch)。

其他人是否获得相同的值,并且将这些值捕获为意味着连接消失是否安全?

当连接重新出现时,我怎样才能最好地恢复?(将当前搜索保存到首选项,并每 5 秒重试一次?)

我怎么知道设备何时决定开始播放它正在缓冲的内容 - 是否有回调(除了 polling isPlaying())?

此外,我不完全确定onBufferingUpdate提供了什么。我正在使用 40 分钟的播客MP3 (64kbps bitrate)- 缓冲 1%、2%、3%。当我寻求大约 30 分钟时,它显示 75%,然后当我回到开始时回到 5% - 除了显示大约缓存的内容之外,这个回调还有什么意义?

最后 - 有什么方法可以将流式传输到MP3?

4

4 回答 4

5

取自这个类似的堆栈溢出问题

我也对 MEDIA_INFO_BUFFERING_START 和 MEDIA_INFO_BUFFERING_END 钩子感到失望……真可惜。

我检查了 Pandora 应用程序,它没有显示缓冲指示器。当音乐因缓冲而中断时,它就静静地呆在那里,就好像什么都没发生一样,UI 看起来还在播放。所以我得出的结论是,如果您使用的是 MediaPlayer,则无法确定轨道是否暂时暂停以进行缓冲。

但是,我确实注意到有几个 MediaPlayer 常量可以使用:MEDIA_INFO_BUFFERING_START 和 MEDIA_INFO_BUFFERING_END。但是它们仅在 API 级别 9+ 中可用,并且文档没有说明它们。我假设它们可以与 OnInfoListener 一起使用。

我很失望,但至少我现在可以停止转动我的轮子并继续做其他事情。

于 2011-02-16T16:15:41.557 回答
2

可以这样做

MediaPlayer 具有注册 OnPreparedListener 和 OnBufferingUpdateListener 的方法

一旦播放器缓冲到足以开始播放,onPrepared 将被调用。

http://developer.android.com/reference/android/media/MediaPlayer.OnPreparedListener.html

将调用 onBufferingUpdate 来更新您的缓冲信息。

http://developer.android.com/reference/android/media/MediaPlayer.OnBufferingUpdateListener.html

您还应该使用连接服务来监听网络连接

public boolean hasConnectivity()
{
    ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = connectivityManager.getActiveNetworkInfo();

    int netType = info.getType();
    int netSubtype = info.getSubtype();

    if (netType == ConnectivityManager.TYPE_WIFI)
    {
        return info.isConnected();
    }
    else if (netType == ConnectivityManager.TYPE_MOBILE && netSubtype == TelephonyManager.NETWORK_TYPE_UMTS)
    {
        return info.isConnected();
    }

    return false;
}
于 2011-11-24T13:31:53.820 回答
1

我认为您应该了解网络的损失/收益。看看:检测 3G 或 Wifi 网络恢复

于 2011-02-03T14:16:01.740 回答
0

当您寻求或跳过或连接丢失并且 MediaPlayer 不断重新连接到代理服务器时,您必须在从客户端获得请求和 range(int) 后发送状态为 206 的此响应。

String headers += "HTTP/1.1 206 Partial Content\r\n";
headers += "Content-Type: audio/mpeg\r\n";
headers += "Accept-Ranges: bytes\r\n";
headers += "Content-Length: " + (fileSize-range) + "\r\n";
headers += "Content-Range: bytes "+range + "-" + fileSize + "/*\r\n";
headers += "\r\n";

当您从 MediaPlayer 收到 HTTP 标头中不包含 Range 的请求时,它正在请求一个新的流文件,在这种情况下,您的响应标头应如下所示:

String headers = "HTTP/1.1 200 OK\r\n";
headers += "Content-Type: audio/mpeg\r\n";
headers += "Accept-Ranges: bytes\r\n";
headers += "Content-Length: " + fileSize + "\r\n";
headers += "\r\n";

享受!

于 2013-01-22T00:46:20.833 回答