android - 在 Exoplayer 中为 .mkv 文件禁用了搜索栏/搜索按钮
问题描述
在 Android 应用程序中,我正在尝试使用Exoplayer从 URL 播放视频。对于.mp4
文件,它可以正常播放,包括寻找功能。但是当我尝试.mkv
播放视频时,搜索栏(时间栏)看起来像进度条(不支持用户搜索)。搜索按钮也不会被激活,点击时没有任何反应。测试了 50 多个视频。它们的文件大小在 20mb 到 150mb 之间。
另一个令人困惑的观察是,一切都适用于另一个.mkv
持续时间为 13 秒且大小小于 1mb 的视频。
搜索功能不适用于大.mkv
文件。使用以下链接进行测试[获得解决方案后删除链接]
搜索功能适用于任何.mp4
文件和小.mkv
文件。适用于以下链接-
[获得解决方案后删除链接]
这是我的android端代码-
依赖-
implementation 'com.google.android.exoplayer:exoplayer:2.10.5'
VideoPlayerActivity.java
DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory(Util.getUserAgent(this, getString(R.string.app_name)));
Map<String, String> headers = new HashMap<>();
headers.put("accept", "application/json");
headers.put(..., ...);
dataSourceFactory.getDefaultRequestProperties().set(headers);
//Also tested with
//DataSource.Factory dataSourceFactory = new DefaultHttpDataSourceFactory(Util.getUserAgent(this, getString(R.string.app_name)));
MediaSource videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
.createMediaSource(mUri);
player.prepare(videoSource);
player.setPlayWhenReady(true);
player.addListener(this);
也试过申请——
DefaultExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
extractorsFactory.setConstantBitrateSeekingEnabled(true);
MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.setExtractorsFactory(extractorsFactory)
.createMediaSource(mUri);
是否有任何选项可以搜索大型.mkv
视频文件?任何其他库也将不胜感激。
更新
如果我尝试以编程方式搜索player.seekTo(15000);
视频,则从头开始。
解决方案
我发现Exoplayer可以很好地与视频编解码器H.264和音频编解码器AAC配合使用 (可能不限于)(来源:medium.com)。
我使用ffmpeg和下面的命令转换了我的视频,现在持续时间长的 mkv 文件对我来说可以正常工作。
ffmpeg -i input.mkv -vcodec libx264 -acodec aac -crf 28 output.mkv
-crf 28
用于减小文件大小,保持质量几乎相同。就我而言——
- 138M的文件变成了
crf
54M的大小。 - 没有
crf
138M 的文件大小变成了 107M。
推荐阅读
- azure - 高基数字段会影响搜索性能吗?
- android - 受信任的 Web 活动是否可以占据屏幕的一部分,而剩余的屏幕会在后台显示活动
- node.js - 如何通过nodejs删除cloudinary中自定义文件夹中的图像?
- javascript - 如何访问 svg 文件的路径数据并将其用作 google-maps 标记?
- android - 如何使用复选框在片段内的弹出菜单中显示所选项目?
- android - 我们可以在 Google Play 商店上签名的应用程序包后更新签名的 APK
- javascript - 使用 webpack 生成的类名渲染静态 html
- python - Python:并行执行多个函数
- swift - 如何查看状态码是不是200?
- gatsby - gatsbyjs (SSR) 在服务器中渲染新数据