目錄
什么是ExoPlayer
一、基本使用
?1、添加依賴項
?2、布局
3、Activity
二、自定義播放暫停
1、首先如何隱藏默認的開始暫停和快進?
2、自定義
三、控制視頻畫面旋轉(zhuǎn)和比例調(diào)整
四、全屏放大和縮小
1、雙擊視頻放大縮小
2、按鈕放大縮小
五、完整的實現(xiàn)代碼
XML
Activity
什么是ExoPlayer
????????ExoPlayer是由Google開發(fā)的媒體播放器庫,支持播放本地和網(wǎng)絡視頻。以下是使用ExoPlayer播放視頻的詳細步驟和代碼示例。
一、基本使用
????????下面實現(xiàn)如下圖所示的兩個播放器的效果:
?1、添加依賴項
build.gradle添加:
implementation 'com.google.android.exoplayer:exoplayer-core:2.15.1'
implementation 'com.google.android.exoplayer:exoplayer-ui:2.15.1'
聲明網(wǎng)絡權限
<uses-permission android:name="android.permission.INTERNET" />
?2、布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/player_view2"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
3、Activity
public class MainActivity extends AppCompatActivity {
private SimpleExoPlayer mPlayer;
private SimpleExoPlayer mPlayer2;
private PlayerView mPlayerView;
private PlayerView mPlayerView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPlayerView = findViewById(R.id.player_view);
mPlayerView2 = findViewById(R.id.player_view2);
// 創(chuàng)建媒體播放器
mPlayer = new SimpleExoPlayer.Builder(this).build();
mPlayer2 = new SimpleExoPlayer.Builder(this).build();
mPlayerView.setPlayer(mPlayer);
mPlayerView2.setPlayer(mPlayer2);
// 設置數(shù)據(jù)源
String videoUrl = "https://v2.kwaicdn.com/upic/2023/04/14/13/BMjAyMzA0MTQxMzA3MDhfNDgwOTQ5MTg2XzEwMDU1NzkwNjgxMV8yXzM=_b_B4856a8b07ea4dbc4ad503f04681b5ec8.mp4?pkey=AAW-JkY6q-BoTEXl2FArO1ReMGt965IaFcPl0NGX7cYTVhLtgZVdld15RtYUAWwkkEmBjjKBPE2yDFb0kigIji2xGTYcxXU-rCTrXNQiN4N4_RpUja5SPyx99Eh46Cixcag&tag=1-1684724589-unknown-0-0eoiahcqin-0a0841bce7d498e5&clientCacheKey=3xt93xmd7emzv6k_b.mp4";
String videoUrl2 = "https://v2.kwaicdn.com/upic/2023/05/20/16/BMjAyMzA1MjAxNjAyMjhfMTM2MDg5NzAyNl8xMDM1MjIwNDgzMjFfMl8z_b_B0d97abd06757be9906cd83e0571dcd7d.mp4?pkey=AAX4DgH_Q4KBjVVQpeITMyNxi34_0KOD7Dp80qxpwuNV4BfONaasSnAkBrFPEdGKbfj0m9Jd_VGG-isTQxiQGOlUQ6e2OKuPO2f72pFUVdxdEJkqCVpijL4zsJu3mMtoBfc&tag=1-1684724589-unknown-0-hilddj6arr-772b90a0f590e795&clientCacheKey=3xhd9ng5fbii652_b.mp4";
MediaItem mediaItem = MediaItem.fromUri(videoUrl);
MediaItem mediaItem2 = MediaItem.fromUri(videoUrl2);
mPlayer.setMediaItem(mediaItem);
mPlayer2.setMediaItem(mediaItem2);
mPlayer.prepare();
mPlayer2.prepare();
}
// 以下是生命周期管理
@Override
protected void onStart() {
super.onStart();
mPlayerView.onResume();
}
@Override
protected void onStop() {
super.onStop();
mPlayerView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mPlayer.release();
}
// 注意:在使用ExoPlayer時,需要在Activity中保持屏幕常亮以避免視頻播放過程中屏幕自動關閉。
@Override
protected void onResume() {
super.onResume();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
@Override
protected void onPause() {
super.onPause();
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}
二、自定義播放暫停
1、首先如何隱藏默認的開始暫停和快進?
????????隱藏它們很簡單,只需把use_controller設置成false即可。
<com.google.android.exoplayer2.ui.StyledPlayerView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:use_controller="false"/>
2、自定義
????????ExoPlayer還提供了很多控制視頻播放的API,如暫停、繼續(xù)、快進、快退、調(diào)整音量、調(diào)整亮度等。下面將介紹如何實現(xiàn)視頻的暫停和繼續(xù)播放。
????????在Activity中添加下面的代碼:
private boolean isPlaying = false;
private void togglePlay() {
if (isPlaying) {
player.pause();
} else {
player.play();
}
isPlaying = !isPlaying;
}
????????利用isPlaying布爾變量記錄當前視頻的播放狀態(tài),使用player.pause()方法暫停視頻,使用player.play()方法繼續(xù)播放視頻,并且通過isPlaying變量更新當前播放狀態(tài)。
????????在SimpleExoPlayerView中添加點擊事件:
playerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
togglePlay();
}
});
這樣就可以實現(xiàn)通過點擊視頻區(qū)域來暫停和繼續(xù)視頻的播放。????????
三、控制視頻畫面旋轉(zhuǎn)和比例調(diào)整
????????xoPlayer支持旋轉(zhuǎn)視頻畫面和調(diào)整視頻比例的功能。下面將介紹如何使用ExoPlayer來實現(xiàn)這些功能。
????????使用代碼旋轉(zhuǎn)視頻畫面,可以調(diào)用SimpleExoPlayerView.setUseController(false)方法隱藏內(nèi)置的控制器,然后利用下面的代碼實現(xiàn)視頻旋轉(zhuǎn):
playerView.setKeepScreenOn(true); playerView.setRotation(90); playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT);
????????通過playerView.setKeepScreenOn(true)方法保持屏幕常亮,playerView.setRotation(90)方法實現(xiàn)視頻的旋轉(zhuǎn),playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT)方法調(diào)整視頻的比例。
四、全屏放大和縮小
????????實現(xiàn)視頻畫面的縮放,可以通過以下代碼實現(xiàn):
private boolean isFullscreen = false;
private void toggleFullscreen() {
if (isFullscreen) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT);
getSupportActionBar().show();
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);
getSupportActionBar().hide();
}
isFullscreen = !isFullscreen;
}
????????利用isFullscreen布爾變量記錄當前是否全屏狀態(tài),使用setRequestedOrientation()方法實現(xiàn)屏幕的旋轉(zhuǎn),使用getWindow().addFlags()和getWindow().clearFlags()方法實現(xiàn)全屏狀態(tài)的切換,并且使用playerView.setResizeMode()方法調(diào)整視頻的比例。在全屏狀態(tài)下隱藏ActionBar,退出全屏狀態(tài)后顯示ActionBar。
1、雙擊視頻放大縮小
????????在SimpleExoPlayerView中添加雙擊事件:
playerView.setOnTouchListener(new View.OnTouchListener() {
private GestureDetector gestureDetector = new GestureDetector(MainActivity.this,
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
toggleFullscreen();
return super.onDoubleTap(e);
}
});
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
gestureDetector.onTouchEvent(motionEvent);
return true;
}
});
????????這樣就可以實現(xiàn)在雙擊視頻區(qū)域時切換視頻的全屏狀態(tài)。
2、按鈕放大縮小
mBtnZoom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleFullscreen();
}
});
五、完整的實現(xiàn)代碼
??????? 如果看不懂前面的操作,可以直接用下面的代碼,有點擊按鈕和雙擊視頻全屏放大縮小效果。文章來源:http://www.zghlxwxcb.cn/news/detail-509067.html
XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_zoom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_margin="16dp"
android:backgroundTint="@color/white"
android:text="Full Screen"
android:textColor="@color/black"
android:visibility="visible"
android:onClick="onFullscreenButtonClick"/>
</RelativeLayout>
Activity
public class MainActivity extends AppCompatActivity {
private SimpleExoPlayer mPlayer;
private PlayerView mPlayerView;
private Button mBtnZoom;
private boolean isFullscreen = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPlayerView = findViewById(R.id.player_view);
mBtnZoom = findViewById(R.id.btn_zoom);
// 創(chuàng)建媒體播放器
mPlayer = new SimpleExoPlayer.Builder(this).build();
mPlayerView.setPlayer(mPlayer);
// 準備視頻源
String videoUrl = "https://v2.kwaicdn.com/upic/2023/04/14/13/BMjAyMzA0MTQxMzA3MDhfNDgwOTQ5MTg2XzEwMDU1NzkwNjgxMV8yXzM=_b_B4856a8b07ea4dbc4ad503f04681b5ec8.mp4?pkey=AAW-JkY6q-BoTEXl2FArO1ReMGt965IaFcPl0NGX7cYTVhLtgZVdld15RtYUAWwkkEmBjjKBPE2yDFb0kigIji2xGTYcxXU-rCTrXNQiN4N4_RpUja5SPyx99Eh46Cixcag&tag=1-1684724589-unknown-0-0eoiahcqin-0a0841bce7d498e5&clientCacheKey=3xt93xmd7emzv6k_b.mp4";
String videoUrl2 = "https://v2.kwaicdn.com/upic/2023/05/20/16/BMjAyMzA1MjAxNjAyMjhfMTM2MDg5NzAyNl8xMDM1MjIwNDgzMjFfMl8z_b_B0d97abd06757be9906cd83e0571dcd7d.mp4?pkey=AAX4DgH_Q4KBjVVQpeITMyNxi34_0KOD7Dp80qxpwuNV4BfONaasSnAkBrFPEdGKbfj0m9Jd_VGG-isTQxiQGOlUQ6e2OKuPO2f72pFUVdxdEJkqCVpijL4zsJu3mMtoBfc&tag=1-1684724589-unknown-0-hilddj6arr-772b90a0f590e795&clientCacheKey=3xhd9ng5fbii652_b.mp4";
MediaItem mediaItem = MediaItem.fromUri(videoUrl);
MediaItem mediaItem2 = MediaItem.fromUri(videoUrl2);
mPlayer.setMediaItem(mediaItem);
mPlayer.prepare();
// 按鈕放大縮小
mBtnZoom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleFullscreen();
}
});
// 雙擊視頻放大縮小
mPlayerView.setOnTouchListener(new View.OnTouchListener() {
private GestureDetector gestureDetector = new GestureDetector(MainActivity.this,
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
toggleFullscreen();
return super.onDoubleTap(e);
}
});
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
gestureDetector.onTouchEvent(motionEvent);
return true;
}
});
}
// 視頻放大縮小方法
private void toggleFullscreen() {
if (isFullscreen) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
mPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT);
getSupportActionBar().show();
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
mPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);
getSupportActionBar().hide();
}
isFullscreen = !isFullscreen;
}
// 以下是生命周期
@Override
protected void onStart() {
super.onStart();
mPlayerView.onResume();
}
@Override
protected void onStop() {
super.onStop();
mPlayerView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mPlayer.release();
}
// 注意:在使用ExoP注意:在使用ExoPlayer時,需要在Activity中保持屏幕常亮以避免視頻播放過程中屏幕自動關閉。layer時,需要在Activity中保持屏幕常亮以避免視頻播放過程中屏幕自動關閉。
@Override
protected void onResume() {
super.onResume();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
@Override
protected void onPause() {
super.onPause();
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}
最后不要忘記添加網(wǎng)絡權限!文章來源地址http://www.zghlxwxcb.cn/news/detail-509067.html
到了這里,關于【Android入門到項目實戰(zhàn)-- 11.4】—— ExoPlayer視頻播放器框架的詳細使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!