更改MediaPlayer的缓冲区大小

23

有没有办法在流媒体MediaPlayer上更改默认缓冲区大小?

4个回答

12

缓冲区大小已经内置在固件中。您所能做的就是关注缓冲区填充的程度,而即使如此,也仅限于按百分比计算。

很抱歉!


2
在谷歌的代码中,我看到了一个方法public boolean setParameter(int key, int value)。如果你已经知道了key的值(我对RK设备有这些值),那么你就可以用它来实现这个目标。不幸的是,尽管该方法是public的,但我找不到调用它的方法,但我会找到的,一定有办法! - paulgavrikov
@bluewhile,你找到解决方法了吗? - w2lame
3
不,我最终哭了,因为我因为谷歌的无知失去了几个大单。 - paulgavrikov

10

大小设置在frameworks/base/media/libstagefright/include/NuCachedSource2.h

kDefaultHighWaterThresholdkDefaultLowWaterThreshold在Android 2.3.7和Android 4.0.4之间有所增加,缓冲区大小增加了8倍,如此线程所述: Android - MediaPlayer Buffer Size in ICS 4.0

您需要一个自定义ROM。

Android 2.3.7

enum {
    kPageSize            = 65536,
    kHighWaterThreshold  = 5 * 1024 * 1024,
    kLowWaterThreshold   = 512 * 1024,

    // Read data after a 15 sec timeout whether we're actively
    // fetching or not.
    kKeepAliveIntervalUs = 15000000,
};

安卓4.0.4

enum {
    kPageSize                       = 65536,
    kDefaultHighWaterThreshold      = 20 * 1024 * 1024,
    kDefaultLowWaterThreshold       = 4 * 1024 * 1024,

    // Read data after a 15 sec timeout whether we're actively
    // fetching or not.
    kDefaultKeepAliveIntervalUs     = 15000000,
};

如果你在意这个问题,那么你可能会对这个故障报告感兴趣 https://code.google.com/p/android/issues/detail?id=29870


4
这可能与您的具体问题不完全相关,但其他人可能会从中受益:
我只需要知道缓冲区有多大。我猜它是一定量的字节,而不是一定量的播放时间。
为了估计音频/视频缓冲区大小,您可以实现 OnBufferingUpdateListener 来检测缓冲区何时完全填充,并使用 TrafficStats 来确定流媒体在开始流和缓冲区完全填满之间消耗了多少字节。这应该是 MediaPlayer 使用的缓冲区大小的指示器...

3
问题出现在直播内容上,例如:网络广播。由于直播内容的长度是无限的,并且MediaPlayer中的onBuffering方法从未被调用,因此我无法计算任何内容。
我的意图是根据比特率因素设置缓冲区以优化资源并将其增加以防止3G断开连接。实际上,我无法防止3G断开连接,但是我想表达的是,我可以使这种连接更长,以保持流媒体对最终用户的持续播放。
因此,我认为我可以编写一个Java代理来连接到直播内容并根据比特率设置自己的缓冲区大小,然后将此代理作为MediaPlayer的url传递并播放内容。
但在开始编写代码之前,我想知道是否有另一种方法或更好的技巧可以应用于MediaPlayer以解决此问题。

嗨Josh,你是怎么解决问题的?你用了流代理吗? - burakk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接