前言

简单记录下一下ExoPlayer+SurfaceViewTextureViewPlayerView的使用以及其优缺点等。

记录一下,方便自己查阅。

正文

导入依赖

implementation "androidx.media3:media3-exoplayer:1.4.1"
implementation "androidx.media3:media3-ui:1.4.1"

ExoPlayer

mExoPlayer = new ExoPlayer.Builder(this).build();
//mExoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE);
mExoPlayer.addListener(this);
mExoPlayer.removeListener(this);
mExoPlayer.release();

重写的监听方法,部分。

@Override
public void onVideoSizeChanged(@NonNull VideoSize videoSize) {
    Log.e(TAG, "onVideoSizeChanged width : " + videoSize.width + " , height : " + videoSize.height);
}

@Override
public void onPlaybackStateChanged(int playbackState) {
    /**
     * STATE_IDLE      1 :始状态,播放器没有可播放的资源,播放器停止播放或者播放失败后也会处于该状态
     * STATE_BUFFERING 2 :没有足够的数据可以加载播放,此时无法立即播放
     * STATE_READY     3 :播放器可以立即播放,是否播放取决于playWhenReady的值,true将会播放,否则不播。
     * STATE_ENDED     4 :播放完了所有的资源后处于该状态
     **/
    Log.e(TAG, "onPlaybackStateChanged playbackState : " + playbackState);
    switch (playbackState) {
        case Player.STATE_IDLE:
            Log.e(TAG, " STATE_IDLE : ");
            break;
        case Player.STATE_BUFFERING:
            Log.e(TAG, " STATE_BUFFERING : ");
            break;
        case Player.STATE_READY:
            Log.e(TAG, " STATE_READY : ");
            break;
        case Player.STATE_ENDED:
            Log.e(TAG, " STATE_ENDED : ");
            break;
    }
}

@Override
public void onMediaMetadataChanged(@NonNull MediaMetadata mediaMetadata) {
    Log.e(TAG, "onMediaMetadataChanged mediaMetadata : " + mediaMetadata);
}

@Override
public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) {
    Log.e(TAG, "onPlayWhenReadyChanged playWhenReady : " + playWhenReady + " , reason : " + reason);
}

@Override
public void onRepeatModeChanged(int repeatMode) {
    Log.e(TAG, "onRepeatModeChanged repeatMode : " + repeatMode);
}

@Override
public void onPlayerErrorChanged(@Nullable PlaybackException error) {
    Log.e(TAG, "onPlayerErrorChanged error : " + error);
}

PlayerView

PlayerView是封装了的自定义View,啥功能都有,比如播放按键,上下曲,快进快退等丰富功能。

xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.media3.ui.PlayerView
        android:id="@+id/video_play_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" />

</FrameLayout>

这里有很多属性配置,比如

# 是否显示控制UI
app:use_controller="false"
# 使用Surface的类型,默认SurfaceView
app:surface_type="texture_view"

等待具体看起香港属性的定义。

代码
PlayerView playerView = findViewById(R.id.video_play_view);
playerView.setPlayer(mExoPlayer);

SurfaceView

xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="@android:color/black"
    android:layout_height="match_parent">

    <SurfaceView
        android:id="@+id/video_surface_view"
        android:layout_width="match_parent"
        android:layout_gravity="center"
        android:layout_height="match_parent" />
</FrameLayout>
代码
mSurfaceView = findViewById(R.id.video_surface_view);
mExoPlayer.setVideoSurfaceView(mSurfaceView);

TextureView

需要在AndroidManifest.xml中application内设置硬件加速,我设备上不设置就不显示图像。

android:hardwareAccelerated="true"
xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextureView
        android:id="@+id/video_texture_view"
        android:layout_width="match_parent"
        android:layout_gravity="center"
        android:layout_height="match_parent" />
</FrameLayout>
代码
mTextureView = findViewById(R.id.video_texture_view);
mExoPlayer.setVideoTextureView(mTextureView);

小结

经过测试,可以总结如下

  1. 相对MediaPlayer来说,ExoPlayer的使用更简单,尤其是添加SurfaceView或TextureView的方式

  2. PlayerView是结合SurfaceView和TextureView,只需要xml中配置即可,默认是SurfaceView

  3. PlayerView使用也更简单,很多功能都有,比如播放按键,上下曲,专辑图解析等

参考文

  1. Exoplayer简单实用

相关文章

暂无评论

none
暂无评论...