前言
简单记录下一下ExoPlayer+SurfaceView,TextureView和PlayerView的使用以及其优缺点等。
记录一下,方便自己查阅。
正文
导入依赖
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);
小结
经过测试,可以总结如下
相对MediaPlayer来说,ExoPlayer的使用更简单,尤其是添加SurfaceView或TextureView的方式
PlayerView是结合SurfaceView和TextureView,只需要xml中配置即可,默认是SurfaceView
PlayerView使用也更简单,很多功能都有,比如播放按键,上下曲,专辑图解析等
参考文
《
© 版权声明