前几天用VideoView
(MediaPlayer+SurfaceView
) 做一个类似于抖音APP的短视频Demo(测试机型 Android8.0 小米6),发现MediaPlayer onPrepared
的时间非常长,好像把一个不到10M的视频全部缓存结束后,才回调onPrepared
,开始视频播放。
因此:
- 学习一下MediaPlayer的buffer大小到底是多少;
MediaPlayer的buffer大小
通过change-buffer-size-on-mediaplayer了解到,Mediaplayer的缓冲区管理类为NuCachedSource2
,该类在Android源码frameworks
某个路径下,缓冲区的上限、下限为固件中写死的两个数值:
Android 2.3.7
线上源码:
frameworks/base/media/libstagefright/NuCachedSource2.h
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
线上源码:
frameworks/base/media/libstagefright/NuCachedSource2.h
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,
};
Android 8.0.0
线上源码:
frameworks/av/include/media/stagefright/NuCachedSource2.h
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,
};
- kDefaultLowWaterThreshold 越大 说明播放前的缓冲时间越长;
- kDefaultKeepAliveIntervalUs 说明如果15s内收不到数据,就需要重启链接;
2.3.7版本 最低、最高值分别是512K 和 5M ;
Android 2.3.7以后,最低值为4M 最高值为20M;
参考:
https://stackoverflow.com/questions/4413300/change-buffer-size-on-mediaplayer
https://issuetracker.google.com/issues/36945644
= THE END =
文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,欢迎关注我的公众号。