我正在使用ExoPlayer,我想自定义ExoPlayer并听取下一个,上一个,倒回,前进的事件,以便当用户点击下一个按钮时播放列表中的下一个视频将播放并且当使用之前的前一个视频时播放列表中的视频将播放等等。我正在使用自定义布局,它会更改设计但不会监听这些事件(下一个,上一个等)。这是我的代码: -
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="200dp">
<com.google.android.exoplayer2.ui.SimpleExoPlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="200dp"
app:resize_mode="fill"
app:controller_layout_id="@layout/custom_controls"
app:player_layout_id="@layout/custom_player_view"
app:surface_type="texture_view"/>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone"/>
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_marginTop="220dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
我在ConcatenatingMediaSource中添加了Mediasource列表。它正在工作,但我也要更改布局,这就是为什么我需要一个侦听器来为ExoPlayer中的每个控件。我看到了link。因此,每当用户点击ExoPlayer中的下一个,上一个,后退,前进按钮时,我就会知道onPositionDiscontinuity()方法调用但是我想要每个按钮的监听器,以便我可以执行相应的操作吗?
感谢
答案 0 :(得分:1)
我使用此link为前一个,下一个等自定义ExoPlayer。您可以实现自己的逻辑来跟踪所有这些事件。它对我有用。
答案 1 :(得分:1)
我的方法
假设我们已经创建了媒体源,DASH或HLS的集合。
使用带有SimpleExoPlayerView
组件的播放器视图。例如,它将自动具有默认控件prev,next。
我使用当前窗口索引处理媒体源集合,使用此exoPlayer.getCurrentWindowIndex()
来回播放媒体源。
您可以通过此onTracksChanged
方法检查当前索引
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
currentIndex = exoPlayer.getCurrentWindowIndex();
}
您可以查看此file以实现这些控制。
希望得到这个帮助。
答案 2 :(得分:0)
您可以添加ExoPlayer.Listener()
并使用PlaybackstateCompat
类中的常量。
覆盖onPlayerStateChanged
听众并使用快退/快进/等检查playbackState
player.addListener(new ExoPlayer.Listener() {
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == PlaybackStateCompat.STATE_FAST_FORWARDING) {
//do something
}
if (playbackState == PlaybackStateCompat.STATE_REWINDING) {
//do something else
}
}
@Override
public void onPlayWhenReadyCommitted() {
}
@Override
public void onPlayerError(ExoPlaybackException error) {
mExoPlayer.stop();
}
});
此外:
STATE_SKIPPING_TO_NEXT
STATE_SKIPPING_TO_PREVIOUS
答案 3 :(得分:0)
if you have not customized exoplayer
if (currentPlayingVodPosition-1 == player.currentWindowIndex){
Toast.makeText(this,"prev clicked",Toast.LENGTH_SHORT).show()
}
if (currentPlayingVodPosition+1 == player.currentWindowIndex){
Toast.makeText(this,"next clicked",Toast.LENGTH_SHORT).show()
}
答案 4 :(得分:0)
拦截 exoplayer 控件 UI 事件的最佳方法是添加自定义调度程序。
mBinding.styledPlayerView.setControlDispatcher(CustomControlDispatcher())
class CustomControlDispatcher(): DefaultControlDispatcher() {
override fun dispatchFastForward(player: Player): Boolean {
Logger.d(TAG, "dispatchFastForward")
return super.dispatchFastForward(player)
}
override fun dispatchRewind(player: Player): Boolean {
Logger.d(TAG, "dispatchRewind")
return super.dispatchRewind(player)
}
}