我正在实现一个从远程计算机播放流的媒体播放器。通过我的应用程序,我可以控制远程机器(例如寻求秒)。像魅力一样,但是:Android Media Player缓冲一些疯狂的10-15秒(!!),这意味着每次点击('搜索')需要10-15秒才能生效,即使它不到一秒钟直到新的数据到达。
我的问题:有没有办法控制(限制)缓存?或者我只是做错了什么?我是唯一有这个问题的人吗?
我的代码非常简单:
player = new MediaPlayer()
player.setDataSource(url);
player.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
player.prepareAsync();
我正在使用本地自建的迷你HTTP服务器将我的字节流连接到Androids媒体播放器。在这种情况下,似乎Android DRM正在延迟/缓存。仍然不太清楚为什么(如果我连接到托管文件的IIS,为什么不)。也不知道如何解决这个问题。
答案 0 :(得分: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
答案 1 :(得分: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();
答案 2 :(得分:0)
问题可能不仅出现在Android Media Player上。 流媒体视频服务器应该支持需要格式。
如果是mp4,则需要安装h264-pseudo-streaming模块(HLS相同) 如果它是MSS(微软平滑流媒体) - IIS有特殊模块。
此外,在用户“进行搜索”后,这意味着Native Player将发送范围请求,这应该由服务器支持。 Nginx默认支持它们,ISS&amp; Apache有一些问题。虽然易于配置。
答案 3 :(得分:0)
我在较新的Android版本中意识到的一件事是它似乎与VBR MP3文件有关。它播放它们,但在启动之前缓冲太多数据。 (3+ MB,我的大多数测试文件)。
(糟糕的黑客)解决方法是从MP3文件中删除XING
标头(这是存储VBR信息的位置)。这似乎使播放器回退到一个更简单的算法,并在缓冲仅100kb后成功开始播放我的所有文件......