8

我正在实现一个播放来自远程机器的流的媒体播放器。通过我的应用程序,我可以控制远程机器(例如寻求第二个)。像魅力一样工作,但是:Android 媒体播放器缓冲了一些疯狂的 10-15 秒(!!),这意味着每次点击('seek')需要 10-15 秒才能生效,即使它距离新的不到一秒数据到达。

我的问题:有没有办法控制(限制)缓存?还是我只是做错了什么?只有我一个人有这个问题吗?

我的代码很简单:

player = new MediaPlayer()
player.setDataSource(url);
player.setOnPreparedListener(new OnPreparedListener() {

    public void onPrepared(MediaPlayer mp) {
        mp.start();
    }
});
player.prepareAsync();

我正在使用本地自建的迷你 HTTP 服务器将我的字节流连接到 Android 媒体播放器。在这种情况下,Android DRM 似乎正在延迟/缓存。仍然不太清楚为什么(如果我连接到托管文件的 IIS,为什么不这样做)。也不知道如何解决这个问题。

4

4 回答 4

1

One thing I realized in the newer Android versions is that it seems to have issues with VBR MP3 files. It plays them, but buffers way too much data before it starts. (3+ MB, the majority of my test files).

A (bad hack) workaround is to remove the XING header from the MP3 files (this is where the VBR information is stored). This seems to make the player fall back to a simpler algorithm and start playback successfully for all my files after buffering only 100kb...

于 2014-07-18T04:33:07.213 回答
1

好的,与此同时,我更接近解决方案。原来我的问题的根源是Android DRM!(不,我不是在播放受保护的文件。它的标准 mp3)。

DRM 似乎已在 Android 3.1 中引入(我在 Galaxy Tab 10.1 上进行测试)。它在模拟器上运行良好(也许 DRM 没有在那里实现?)

知道如何禁用或加速它吗?在 Android DRM impl 的某个深处似乎有一个 10 秒的计时器等待 - 无论如何,不​​知道。我的错误日志:

10-06 17:38:19.020: ERROR/MediaExtractor(226): **********MediaExtractor::Create
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(226): add uniqueid
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 1
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :ADD_UNIQUEID
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 3
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :ADD_CLIENT
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(226): Entering BpDrmManagerService::openDecryptSession
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 27
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI
10-06 17:38:19.020: ERROR/DrmManagerService(Native)(225): Entering DrmManagerService::openDecryptSession with uri

10 seconds wait

10-06 17:38:29.040: ERROR/DrmManager(Native)(225): DrmManager::openDecryptSession: no capable plug-in found
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): NULL decryptHandle is returned
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(226): no decryptHandle is generated in service side
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(226): remove uniqueid
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 2
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :REMOVE_UNIQUEID
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 4
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :REMOVE_CLIENT
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(226): setDrmServiceListener
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 5
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER
10-06 17:38:29.040: ERROR/DrmManagerService(Native)(225): Entering setDrmServiceListener
于 2011-10-06T00:46:32.803 回答
0

问题可能不仅在 Android 媒体播放器上。流媒体视频的服务器应该支持需要的格式。

如果是 mp4,则需要安装 h264-pseudo-streaming 模块(与 HLS 相同) 如果是 MSS(微软平滑流) - IIS 有特殊模块。

此外,在用户“进行搜索”之后,这意味着 Native Player 将发送范围请求,这应该得到服务器的支持。Nginx 默认支持它们,ISS 和 Apache 对此有一些问题。虽然很容易配置。

于 2014-07-01T14:14:27.160 回答
0

尝试这个。这肯定会对你有所帮助::

 private class TouchandshowTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... arg0) {
        try {
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        player.setDataSource("URL");
        player.prepare();
    } catch (Exception e) {
        // TODO: handle exception
    }

        return null;
    }
    protected void onPostExecute(final Void unused) {

    }
}

OnCreate()

new TouchandshowTask().execute();
于 2011-10-04T05:55:24.843 回答