有没有办法在流MediaPlayer
上更改默认缓冲区大小?
答案 0 :(得分:12)
将缓冲区大小烘焙到固件中。你所能做的就是密切关注缓冲区的填充量,甚至只是基于百分比。
抱歉!
答案 1 :(得分:11)
大小在 frameworks / base / media / libstagefright / include / NuCachedSource2.h中设置
Android 2.3.7和Android 4.0.4之间kDefaultHighWaterThreshold 和 kDefaultLowWaterThreshold 上升 缓冲区大小增长了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,
};
Android 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
答案 2 :(得分:4)
这可能与您的具体问题并不完全相关,但也许其他人会得到这方面的帮助:
我只需知道缓冲区有多大。我猜这是一个固定的字节数,而不是固定的播放时间。
要估算音频/视频缓冲区大小,可以实现OnBufferingUpdateListener以检测缓冲区何时完全填充,并使用TrafficStats确定流媒体消耗的字节数在启动流和缓冲区之间充满。这应该是MediaPlayer使用的缓冲区大小的指示...
答案 3 :(得分:3)
流媒体直播内容时出现问题,例如:直播互联网广播。作为实况内容,我无法计算任何内容,因为轨道长度是无限的,MediaPlayer中的onBuffering方法永远不会被调用。
我的目的是根据比特率因子设置缓冲区以优化资源并增加它以防止3G断开。好吧,我真的无法阻止3G断线,但我想说我可以延长这个连接,以便让最终用户更加流畅。
所以我认为我可以编写Java代理来连接实时内容并根据比特率设置我自己的缓冲区大小,然后将此代理作为url传递给MediaPlayer并播放内容。
但在开始编码之前,我想知道是否有其他方法或其他更好的技巧可以应用于MediaPlayer来解决这个问题。