Exoplayer 自定义数据源:有没有办法让玩家请求大块数据?
Exoplayer custom DataSource: Is there a way to make player ask for big chunks of data?
我已经实现了自定义 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 端预加载大块数据可将初始化速度从几分钟缩短到几秒钟。
我已经实现了自定义 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 端预加载大块数据可将初始化速度从几分钟缩短到几秒钟。