android - 如何初始化 exoplayer 以播放破折号(.mpd)视频
问题描述
我有破折号视频的播放列表,这是我在版本为 2.7.3 时用来播放媒体的代码。现在我已经更新到 2.9.5,我遇到了问题。
我的 init 和 mediasource 方法:
private void initializePlayer() {
if (player == null) {
// a factory to create an AdaptiveVideoTrackSelection
TrackSelection.Factory adaptiveTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(BANDWIDTH_METER);
player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(adaptiveTrackSelectionFactory),
new DefaultLoadControl());
player = ExoPlayerFactory.newSimpleInstance(new DefaultRenderersFactory(this),
new DefaultTrackSelector(), new DefaultLoadControl());
playerView.setPlayer(player);
player.addListener(new PlayerEventListener());
/*player.setPlayWhenReady(playWhenReady);
player.seekTo(currentWindow, playbackPosition);*/
}
playListMediaSources = buildPlayListMediaSource(serialURLs);
concatenatingMediaSource = new ConcatenatingMediaSource(playListMediaSources);
player.prepare(concatenatingMediaSource, true, false);
player.setPlayWhenReady(playWhenReady);
player.seekTo(currentWindow, playbackPosition);
}
private MediaSource buildMediaSource(Uri uri) {
/* DefaultExtractorsFactory defaultExtractorsFactory = new DefaultExtractorsFactory();
DefaultHttpDataSourceFactory defaultHttpDataSourceFactory = new DefaultHttpDataSourceFactory("user-agent");*/
DataSource.Factory manifestDataSourceFactory =
new DefaultHttpDataSourceFactory("ua");
DashChunkSource.Factory dashChunkSourceFactory =
new DefaultDashChunkSource.Factory(
new DefaultHttpDataSourceFactory("ua", BANDWIDTH_METER));
return new DashMediaSource.Factory(dashChunkSourceFactory,
manifestDataSourceFactory).createMediaSource(uri);
}
private MediaSource[] buildPlayListMediaSource(String[] serialURLs) {
MediaSource[] mediaSources = new MediaSource[serialURLs.length];
Uri uri;
for (int i = 0; i < serialURLs.length; i++) {
uri = Uri.parse(serialURLs[i]);
mediaSources[i] = buildMediaSource(uri);
}
return mediaSources;
}
我将我的初始化代码修改为:
private void initializePlayer() {
if (player == null) {
TrackSelection.Factory adaptiveTrackSelectionFactory = new AdaptiveTrackSelection.Factory();
player = ExoPlayerFactory.newSimpleInstance(this,
new DefaultRenderersFactory(this),
new DefaultTrackSelector(adaptiveTrackSelectionFactory),
new DefaultLoadControl());
player = ExoPlayerFactory.newSimpleInstance(this,new DefaultRenderersFactory(this),
new DefaultTrackSelector(), new DefaultLoadControl());
}
if (serialURLs != null) {
playListMediaSources = buildPlayListMediaSource(serialURLs);
concatenatingMediaSource = new ConcatenatingMediaSource(playListMediaSources);
player.prepare(concatenatingMediaSource, true, false);
player.setPlayWhenReady(playWhenReady);
player.seekTo(currentWindow, playbackPosition);
}
}
但无法播放视频。我的猜测是我还必须对媒体源方法进行一些更改,但我无法弄清楚这些更改。使用我当前的代码,日志显示以下错误:
E/AndroidRuntime: FATAL EXCEPTION: ExoPlayerImplInternal:Handler
Process: com.packagename, PID: 2731
java.lang.AbstractMethodError: abstract method "void com.google.android.exoplayer2.source.BaseMediaSource.prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"
at com.google.android.exoplayer2.source.BaseMediaSource.prepareSource(BaseMediaSource.java:140)
at com.google.android.exoplayer2.ExoPlayerImplInternal.prepareInternal(ExoPlayerImplInternal.java:398)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:285)
at android.os.Handler.dispatchMessage(Handler.java:101)
at android.os.Looper.loop(Looper.java:164)
at android.os.HandlerThread.run(HandlerThread.java:65)
我正在添加此文本以避免大部分代码错误。任何帮助表示赞赏。提前致谢。
解决方案
两者com.google.android.exoplayer:exoplayer-core
和都com.google.android.exoplayer:exoplayer-dash
需要在你的 build.gradle 中是相同的版本。
implementation 'com.google.android.exoplayer:exoplayer-core:2.9.6'
implementation 'com.google.android.exoplayer:exoplayer-dash:2.9.6'
推荐阅读
- node.js - 带有 Winston 记录器的 AWS Lambda 抛出 Runtime.ImportModuleError
- asp.net-core - 基于 ASP.NETCore 中模型计数器的自定义 tagHelper
- c++ - 删除字符串后在 C++ 中检测到堆损坏
- angular - 集成测试 ReactiveForm,valueChanges 方法未触发
- macos - 在 mac os x 中运行 crontab 任务时未绑定的变量
- php - PHP 警告:foreach() 提供的参数 2 和无效参数
- python - pyppeteer - 如何通过使用 python pyppeteer 在页面中单击子链接 (href) 转到下一页
- android - 如何在物理设备上检测 Xamarin.forms android 中的网络调用?
- python - Django 框架 - 填充模型
- redis - 在 Redis 中查询频率统计信息?