15

我已经看到很多帖子在 SO 上提出这个问题,但似乎没有明确的答案(或者至少是我喜欢的答案!)

我的内容受到基本身份验证(用户名/密码)的保护——我可以使用各种 HTTP 下载类很好地下载它,但对于我来说,我无法弄清楚如何告诉媒体播放器流式传输它(并提供认证)。我看到一篇帖子暗示这是不可能的,因为 MediaPlayer 都是本机代码,不像 Authenticator 那样。

有很多关于如何首先下载到缓存副本然后播放的示例,但是....那种很糟糕(文件可能有 100 个 MB)。我看到至少一个建议以小块下载它,然后开始和停止播放(重定向到新文件),但这也很糟糕,因为(我认为)会出现口吃(虽然我还没有尝试过) )

此时我最好的想法是开始下载到缓存文件,然后当它“足够”时开始播放,同时我继续填充文件....我希望这可行(但同样,没有试过了)。

我错过了一些明显的东西吗?让所有不同的部分几乎都能正常工作真是太痛苦了,我有点说服自己必须有一种方法来原生地流式传输受保护的内容(或者让它采用已经建立和合格的 InputStream),但它似乎并不快乐。

顺便说一句,我是 Mac/iPhone 用户,也是 Android 的新手,所以我仍在努力学习 Java。如果我遗漏了一些明显的东西,请原谅。

4

3 回答 3

2

如果您控制服务器,则一种选择可能是对其进行修改,以便可以选择在身份验证时为内容生成一个临时的随机 URL,然后将其流式传输。流式处理函数是否会接受包含脚本参数的 URL?

要完全在手机上做事,另一种选择是用 java 或本机代码编写一个简单的 http 代理,如服务器,并在后台线程中运行。您无需将媒体播放器指向服务器,而是将其指向您自己的设备代理。代理将请求传递到远程服务器,同时处理身份验证。

于 2010-12-08T15:13:03.377 回答
1

一种方法是自己下载数据,将其解码(从??? 到 PCM)并使用 AudioTrack 播放 PCM。诀窍在于解码。流以什么格式编码?

通用协议的原始解码器在 Android 上可用,但在 C 库中。因此,您可能必须再次添加一个 JNI 层来进行解码,具体取决于您的流的编码。

于 2011-03-30T20:46:07.223 回答
0

我遇到了同样的问题,我通过将凭据放入 URL 来解决它。HTTP 没有正式支持它,但大多数 Web 客户端都支持它。

以下代码基于本教程: http: //www.coderzheaven.com/2012/08/14/stream-audio-android/

    try {
        // You can use HTTPS or HTTP as protocol.
        String myURL = "https://example.com/song.mp3";

        mp.reset();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.setOnPreparedListener(this);
        mp.setOnErrorListener(this);

        // These are the two lines, doing the magic ;) It transforms it to a url like this: https://user:password@example.com/song.mp3
        UsernamePasswordCredentials credentials = connHelper.getCredetials();
        myURL = myURL.replace("://", "://" + URLEncoder.encode(credentials.getUserName(), "UTF-8") + ":" + URLEncoder.encode(credentials.getPassword(), "UTF-8") + "@");

        mp.setDataSource(myURL);
        mp.prepareAsync();
        mp.setOnCompletionListener(this);
    } catch (Exception e) {
        Log.e("StreamAudioDemo", e.getMessage());
    }

注意:通过在此处使用 URLEncoder,我们希望解决以下问题:如果用户名或密码包含冒号或 @。

注意 2:它可能适合您,也可能不适合您,具体取决于您的服务器。如果您遇到该问题,我建议您查看该问题:为什么在 URL 中提供凭据时浏览器不发送 Authentication 标头?

于 2014-09-02T18:42:52.307 回答