Android視頻播放器——DKVideoPlayer
DKVideoPlayer介紹:
1. 標星5k的Android視頻播放器,支持原生VideoView組件核心,Bilibili的IjkPlayer組件核心,ExoPlayer組件核心,可切換核心
2. 視頻組件自帶播放暫停,進度條,全屏,播放開始,播放結束,重新播放等ui樣式。也可自己修改界面樣式和功能
3. 可設置靜音,輪播,倍速,小窗,鎖定播放界面,邊播邊緩存,視頻截圖,連續播放視頻集,調整顯示比例,或無組件純視頻播放
4. 支持raw,assert,file,url
5. 可播放在線視頻流
DKVideoPlayer地址:https://github.com/Doikki/DKVideoPlayer
坐標:
# 必選,內部默認使用系統mediaplayer進行解碼
implementation 'xyz.doikki.android.dkplayer:dkplayer-java:3.3.7'
# 可選,包含StandardVideoController的實現
implementation 'xyz.doikki.android.dkplayer:dkplayer-ui:3.3.7'
# 可選,使用exoplayer進行解碼
implementation 'xyz.doikki.android.dkplayer:player-exo:3.3.7'
# 可選,使用ijkplayer進行解碼
implementation 'xyz.doikki.android.dkplayer:player-ijk:3.3.7'
# 可選,如需要緩存或者抖音預加載功能請引入此庫
implementation 'xyz.doikki.android.dkplayer:videocache:3.3.7'
使用:
1. 基本使用:
1.1添加布局:
<xyz.doikki.videoplayer.player.VideoView android:id="@+id/player" android:layout_width="match_parent" android:layout_height="300dp" />
1.2設置視頻地址和控制器:
//videoView.setUrl("https://www.baidu.com/a.mp4") //播放網絡視頻
//videoView.setUrl("android.resource://" + getPackageName() + "/" + R.raw.movie") //播放raw文件里視頻資源,連接格式 android.resourcde://com.dueeeke.dkplayer/"+R.raw.moveid
//videoView.setUrl("file:///android_asset/test.mp4") //播放assert里的視頻 連接格式 file://android_asset/test.mp4
//videoView.setUrl("/sdcard/Alarms/xxx.mp4") //播放安卓本地路徑視頻 /sdcard/xxx
videoView.setUrl(String url); //設置視頻地址
StandardVideoController controller = new StandardVideoController(this); controller.addDefaultControlComponent("標題", false); //controller設置為默認控制器 videoView.setVideoController(controller); //設置控制器 videoView.start(); //開始播放,不調用則不自動播放
1.3播放生命周期:(implements xyz.doikki.videoplayer.player.VideoView.OnStateChangeListener)
@Override public void onPlayerStateChanged(int playerState) { switch (playerState) { case VideoView.PLAYER_NORMAL://小屏 break; case VideoView.PLAYER_FULL_SCREEN://全屏 break; } } @Override public void onPlayStateChanged(int playState) { switch (playState) { case VideoView.STATE_IDLE: break; case VideoView.STATE_PREPARING: //準備播放中 //在STATE_PREPARING時設置setMute(true)可實現靜音播放 //mVideoView.setMute(true); break; case VideoView.STATE_PREPARED: //準備播放后 break; case VideoView.STATE_PLAYING: //播放中 //需在此時獲取視頻寬高 int[] videoSize = mVideoView.getVideoSize(); L.d("視頻寬:" + videoSize[0]); L.d("視頻高:" + videoSize[1]); break; case VideoView.STATE_PAUSED: //播放暫停 break; case VideoView.STATE_BUFFERING: break; case VideoView.STATE_BUFFERED: break; case VideoView.STATE_PLAYBACK_COMPLETED: //播放完成 break; case VideoView.STATE_ERROR: break; } }
videoView.addOnStateChangeListener(this); //添加該播放狀態監聽器
1.4在Activity中
@Override protected void onPause() { super.onPause(); videoView.pause(); } @Override protected void onResume() { super.onResume(); videoView.resume(); } @Override protected void onDestroy() { super.onDestroy(); videoView.release(); } @Override public void onBackPressed() { if (!videoView.onBackPressed()) { super.onBackPressed(); } }
<!-- AndroidManifest.xml -->
<activity
android:name=".PlayerActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="portrait" /> <!-- or android:screenOrientation="landscape"-->
完整代碼
public class DKVideoPlayerActivity extends AppCompatActivity implements View.OnClickListener ,VideoView.OnStateChangeListener { private String uri = "android.resource://com.ruidiculous.mywebviewdemo/"+R.raw.gta6; private VideoView videoView; private Button btnLoop , btnVoiceSilence, btnVoiceResume; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_d_k_video_player); VideoViewManager.setConfig(VideoViewConfig.newBuilder() //使用使用IjkPlayer解碼 .setPlayerFactory(IjkPlayerFactory.create()) .build()); videoView = findViewById(R.id.videoView); videoView.setUrl(uri); //設置視頻地址 // 視頻界面:封面,全屏,底部控制條,播放暫停等等 StandardVideoController controller = new StandardVideoController(this); controller.addDefaultControlComponent("標題", false); videoView.setVideoController(controller); //設置控制器 videoView.addOnStateChangeListener(this); videoView.start(); //開始播放,不調用則不自動播放 btnLoop = findViewById(R.id.btnLoop); btnVoiceSilence = findViewById(R.id.btnVoiceSilence); btnVoiceResume = findViewById(R.id.btnVoiceResume); btnLoop.setOnClickListener(this); } @Override public void onClick(View v) { switch ( v.getId() ){ case R.id.btnLoop: videoView.setLooping(true); break; case R.id.btnVoiceSilence: videoView.setMute(true); break; case R.id.btnVoiceResume: videoView.setMute(false); break; } } @Override public void onPlayerStateChanged(int playerState) { } @Override public void onPlayStateChanged(int playState) { switch (playState) { case VideoView.STATE_IDLE: break; case VideoView.STATE_PREPARING: //準備中 Toast.makeText(this,"準備中",Toast.LENGTH_SHORT).show(); break; case VideoView.STATE_PREPARED: //準備完成 Toast.makeText(this,"準備完成",Toast.LENGTH_SHORT).show(); break; case VideoView.STATE_PLAYING: //播放中 //需在此時獲取視頻寬高 int[] videoSize = videoView.getVideoSize(); L.d("視頻寬:" + videoSize[0]); L.d("視頻高:" + videoSize[1]); break; case VideoView.STATE_PAUSED: //暫停 Toast.makeText(this,"暫停",Toast.LENGTH_SHORT).show(); break; case VideoView.STATE_BUFFERING: break; case VideoView.STATE_BUFFERED: break; case VideoView.STATE_PLAYBACK_COMPLETED: //播放完成 Toast.makeText(this,"播放完成",Toast.LENGTH_SHORT).show(); break; case VideoView.STATE_ERROR: break; } } }

2.功能:
重復播放:
videoView.setLooping(true);
聲音靜音:
videoView.setMute(true);
取消全屏:
case xyz.doikki.videoplayer.player.VideoView.PLAYER_FULL_SCREEN://全屏 videoView.setScreenScaleType(xyz.doikki.videoplayer.player.VideoView.SCREEN_SCALE_DEFAULT); videoView.stopFullScreen(); break;
暫停播放:
videoView.pause();
開始播放:
videoView.start();
釋放資源:
videoView.release();
倍速播放:
mVideoView.setSpeed(1.0f);
視頻截圖:
ImageView imageView = findViewById(R.id.iv_screen_shot); Bitmap bitmap = mVideoView.doScreenShot(); imageView.setImageBitmap(bitmap);
設置基本控制器:
創建控制器對象,調用控制器對象.addDefaultControlComponent("標題", false)為控制器進行基礎設置
StandardVideoController controller = new StandardVideoController(this); controller.addDefaultControlComponent("標題", false); //控制器進行默認設置 videoView.setVideoController(controller); //設置控制器
視頻控制器具體:
通過添加多類別界面組合整個視頻播放UI界面,分為:自動完成播放界面,錯誤界面,標題界面,點播控制條界面。
這里不用默認,自行添加需要的界面。
//視頻界面:封面,全屏,底部控制條,播放暫停等等 StandardVideoController controller = new StandardVideoController(this); //controller.addDefaultControlComponent("標題", false); controller.addControlComponent(new CompleteView(this));//自動完成播放界面 controller.addControlComponent(new ErrorView(this));//錯誤界面 TitleView titleView = new TitleView(this);//標題欄 titleView.setTitle("標題!"); controller.addControlComponent(titleView); //根據是否為直播設置不同的底部控制條 VodControlView vodControlView = new VodControlView(this);//點播控制條 MyVodControlView myVodControlView = new MyVodControlView(this); controller.addControlComponent(vodControlView); GestureView gestureControlView = new GestureView(this);//滑動控制視圖 controller.addControlComponent(gestureControlView); //根據是否為直播決定是否需要滑動調節進度 controller.setCanChangePosition(true); videoView.setVideoController(controller); //設置控制器 videoView.addOnStateChangeListener(this); videoView.start(); //開始播放,不調用則不自動播放 // 視頻已實現暫停,繼續,拖動
2. 修改或擴展功能
比如要修改點播控制條,去除全屏功能。
1. 復制VodControlView代碼
2. 對內部組件進行修改比如 mFullxxx.setVisiable(GONE);
3. 調用controller.addControlComponent(myVodControlView); 添加自定義視圖
完整項目代碼
public class DKVideoPlayerActivity extends AppCompatActivity implements View.OnClickListener ,VideoView.OnStateChangeListener { private String uri = "android.resource://com.ruidiculous.mywebviewdemo/"+R.raw.gta6; private VideoView videoView;private Button btnLoop , btnVoiceSilence, btnVoiceResume; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_d_k_video_player); VideoViewManager.setConfig(VideoViewConfig.newBuilder() //使用使用IjkPlayer解碼 .setPlayerFactory(IjkPlayerFactory.create()) .build()); videoView = findViewById(R.id.videoView); videoView.setUrl(uri); //設置視頻地址 //視頻界面:封面,全屏,底部控制條,播放暫停等等 StandardVideoController controller = new StandardVideoController(this); //controller.addDefaultControlComponent("標題", false); controller.addControlComponent(new CompleteView(this));//自動完成播放界面 controller.addControlComponent(new ErrorView(this));//錯誤界面 TitleView titleView = new TitleView(this);//標題欄 titleView.setTitle("標題!"); controller.addControlComponent(titleView); //根據是否為直播設置不同的底部控制條 VodControlView vodControlView = new VodControlView(this);//點播控制條 MyVodControlView myVodControlView = new MyVodControlView(this); controller.addControlComponent(vodControlView); GestureView gestureControlView = new GestureView(this);//滑動控制視圖 controller.addControlComponent(gestureControlView); //根據是否為直播決定是否需要滑動調節進度 controller.setCanChangePosition(true); videoView.setVideoController(controller); //設置控制器 videoView.addOnStateChangeListener(this); videoView.start(); //開始播放,不調用則不自動播放 // 視頻已實現暫停,繼續,拖動 btnLoop = findViewById(R.id.btnLoop); btnVoiceSilence = findViewById(R.id.btnVoiceSilence); btnVoiceResume = findViewById(R.id.btnVoiceResume); btnLoop.setOnClickListener(this); } @Override public void onClick(View v) { switch ( v.getId() ){ case R.id.btnLoop: videoView.setLooping(true); break; case R.id.btnVoiceSilence: videoView.setMute(true); break; case R.id.btnVoiceResume: videoView.setMute(false); break; } } @Override public void onPlayerStateChanged(int playerState) { }
@Override public void onPlayStateChanged(int playState) { switch (playState) { case VideoView.STATE_IDLE: break; case VideoView.STATE_PREPARING: //準備中 Toast.makeText(this,"準備中",Toast.LENGTH_SHORT).show(); break; case VideoView.STATE_PREPARED: //準備完成 Toast.makeText(this,"準備完成",Toast.LENGTH_SHORT).show(); break; case VideoView.STATE_PLAYING: //播放中 //需在此時獲取視頻寬高 int[] videoSize = videoView.getVideoSize(); L.d("視頻寬:" + videoSize[0]); L.d("視頻高:" + videoSize[1]); break; case VideoView.STATE_PAUSED: //暫停 Toast.makeText(this,"暫停",Toast.LENGTH_SHORT).show(); break; case VideoView.STATE_BUFFERING: break; case VideoView.STATE_BUFFERED: break; case VideoView.STATE_PLAYBACK_COMPLETED: //播放完成 Toast.makeText(this,"播放完成",Toast.LENGTH_SHORT).show(); break; case VideoView.STATE_ERROR: break; } } }

浙公網安備 33010602011771號