基於ExoPlayer的ExoVideoView
前言
本人之前寫過一篇名為基於ExoPlayer的ExoPlayerVideoView的文章,近日發現竟然被盜用了。
今日再次釋出本文是因為ExoVideoView
升級啦,新版的更好用,支援更多功能,支援自定義controller。
特性
1.自動處理音訊焦點。
2.根據感測器自動處理方向。
3.手勢支援。
4.多清晰度選擇支援。
5.為控制器新增自定義佈局.
6.調整顯示大小。
7.自定義controller。
使用 ExoVideoView
1.依賴
最簡單的方式是加入gradle依賴。請確認在工程的build.gradle中新增了JCenter和google()。
repositories {
jcenter()
google()
}
然後在你的專案中新增如下程式碼:
implementation `com.jarvanmo:exoplayerview:2.0.8`
2.在xml中定義
在xml中使用 ExoVideoView:
<com.jarvanmo.exoplayerview.ui.ExoVideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="300dp"/>
3.在java程式碼中
ExoVideoView 提供了內建Player
:
SimpleMediaSource mediaSource = new SimpleMediaSource(url);//也支援uri
videoView.play(mediaSource);
videoView.play(mediaSource,where);//play from a particular position
也可以使用自義的Player:
videoView.setPlayer(player);
提示:不要忘記釋放ExoPlayer:
videoView.releasePlayer();
詳情請移步demo.
3.方向管理
ExoVideoView 可以自動處理方向問題,前提是為ExoVideoView設定一個OrientationListener:
videoView.setOrientationListener(orientation -> {
if (orientation == SENSOR_PORTRAIT) {
//do something
} else if (orientation == SENSOR_LANDSCAPE) {
//do something
}
});
提示:當ExoVideoView自動處理方向問題時,如果在Controller中的context是Activity,那麼系統會呼叫activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE)
or activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
全屏事件處理也是如此。
4返回管理
首先,重寫onKeyDown:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return videoView.onKeyDown(keyCode, event);
}
return super.onKeyDown(keyCode, event);
}
為ExoVideoView設定監聽:
videoView.setBackListener((view, isPortrait) -> {
if (isPortrait) {
//do something
}
return false;
});
如果返回值是 true
, 系統後續動作會被中斷.否則,ExoVideoView會自動處理方向,並且會回撥OrientationLister.onOrientationChange()
.
高階
1.多清清晰度
ExoVideoView 內建清晰度選擇器.如果開啟發多清晰度並新增了多清晰度,內建清晰度選擇器將被加入overlayFrameLayout
.
List<ExoMediaSource.Quality> qualities = new ArrayList<>();
ExoMediaSource.Quality quality =new SimpleQuality(quality,mediaSource.url());
qualities.add(quality);
mediaSource.setQualities(qualities);
2.Controller顯示模式
ExoVideoPlaybackController
被分為四個部分:
1.Top
2.Top Landscape
3.Bottom
4.Bottom Landscape
每一部分都可以被顯示或隱藏:
app:controller_display_mode="all|none|top|top_landscape|bottom|bottom_landscape"
在java中:
videoView.setControllerDisplayMode(mode);
3.為controller新增控制元件
ExoVideoPlaybackController
允許在java程式碼中新增控制元件.
videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_TOP, view);
videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_TOP_LANDSCAPE, view);
videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_BOTTOM_LANDSCAPE, view);
4.使用自定義controller佈局
exo_video_playback_control_view.xml
是允許自定義的。其中一些屬性在ExoVideoPlaybackControlView
有定義。具體可看原始碼。
app:controller_layout_id="@layout/my_controller"
其他
app:controller_background="@android:color/holo_orange_dark"
app:use_artwork="true"
app:default_artwork="@drawable/default_art"
相關文章
- Android視訊開發進階(part5-ExoPlayer分析1,ExoPlayer的handler)Android
- ExoPlayer的使用與解析(官方文件翻譯)
- EXOPlayer居中播放,類似ImageView的CENTER_CROPView
- ExoPlayer基本使用和關鍵類流程
- FFmpeg開發筆記(五十六)使用Media3的Exoplayer播放網路影片筆記
- 基於javaEE的看看Java
- 基於jQuery的AjaxjQuery
- 基於graphql的微服務基礎框架微服務框架
- 基於相關畢業設計論文下載基於WEB,基於java基於JSPWebJavaJS
- 【基礎知識】基於事物的臨時表和基於會話的臨時表會話
- 基於JSP的微博JS
- 關於hive的基礎Hive
- 基於 Traefik 的 ForwardAuth 配置Forward
- 基於mpvue的toast元件VueAST元件
- 基於canvas的骨骼動畫Canvas動畫
- Oracle基於值的稽核Oracle
- 基於梯度的學習梯度
- 基於策略的管理方案
- 基於事件的排程事件
- 基於函式的索引函式索引
- ES 筆記十六:基於詞項和基於全文的搜尋筆記
- 基於sanic的微服務基礎架構微服務架構
- 基於 LNMP 的 Nginx 百萬併發之路 (三)基於域名的虛擬主機LNMPNginx
- 基於flask的最小的應用Flask
- 基於golang的聊天室Golang
- 基於 Hyperf 開發的商城
- FluentAspects -- 基於 Fluent API 的 AopAPI
- 基於 Redis 的 LBS 嘗試Redis
- 基於OkHttp的Http監控HTTP
- 基於react + redux的Bone框架ReactRedux框架
- 基於jquery實現的ExceljQueryExcel
- 基於JVMTI的Agent實現JVM
- 基於Github的敏捷開發Github敏捷
- 基於 MHA 高可用的 MySQLMySql
- 基於 SpringBoot 的 FileServiceSpring Boot
- 基於Gitlab的CICD流程Gitlab
- 基於github的CICD實踐Github
- 基於ECDHE的TLS握手流程TLS