问题描述
我已经实现了自定义DataSource
与ProgressiveMediaSource
一起使用。
private MediaSource buildMediaSource() {
MyDataSource.Factory factory = new MyDataSource.Factory(getItem());
return new ProgressiveMediaSource.Factory(factory).createMediaSource(Uri.EMPTY);
}
当我尝试打开多个MKV文件时,播放器多次调用read(byte[] buf,int offset,int readLength)
函数,将1
传递为readLength
。
这将导致在开始播放视频之前初始化时间分钟(播放器希望在我拥有的视频上按1字节读取600000次)
要进行测试,我已经设置了自己的http服务器,并为该视频形成了一个uri,然后我将其像这样使用:
new ProgressiveMediaSource.Factory(new DefaultHttpDataSourceFactory("sdfsdfds")).createMediaSource(uri); // uri looks like http://127.0.0.1:34567/video.mkv
,然后玩家开始请求16384
作为readLength
。视频初始化需要几秒钟。
我有办法告诉玩家阅读大块吗? 也许有一种方法可以告诉MatroskaExtractor忽略一些不需要的东西?我仍然需要寻找
解决方法
我的问题是,对于每个 read(),我必须从本机库中调用一些函数,导致将 java 结构转换为 c++,然后再转换回 java 以获得响应。
对于仅 1 个字节来说,这是非常繁重的操作。快速测试表明,在 java 端预加载大块数据可将初始化速度从几分钟缩短到几秒钟。