網站首頁 編程語言 正文
前言
今天,和大家分享一個開源的多功能視頻播放器 — GSYVideoPlayer,支持彈幕,濾鏡、水印、gif截圖,片頭廣告,聲音、亮度調節等眾多功能,這里就利用它來實現一個標準的視頻播放器,那么,話不多說,Go ~
GSYVideoPlayer 一個基于IJkPlayer的播放器
支持調節聲音亮度
邊播邊緩存 使用了AndroidVideoCache;ExoPlayer使用SimpleCache
支持多種協議h263\4\5、Https、concat、rtsp、hls、rtmp、crypto、mpeg等等
簡單濾鏡(馬賽克、黑白、色彩過濾、高斯、模糊、模糊等等20多種)、動畫、(水印、畫面多重播放等)
視頻第一幀、視頻幀截圖功能,視頻生成gif功能。
調整顯示比例:默認、16:9、4:3、填充;播放時旋轉畫面角度(0,90,180,270);鏡像旋轉
IJKPlayer、EXOPlayer、MediaPlayer切換、自定義內核
小窗口、多窗體下(包括桌面)的小窗口播放。
片頭廣告、跳過廣告支持、中間插入廣告功能。
暫停前后臺切換不黑屏;調整不同清晰度的支持;無縫切換支持;鎖定/解鎖全屏點擊功能;進度條小窗口預覽
可自定義渲染層、自定義管理層、自定義播放層(控制層)、自定義緩存層
引入依賴
? ? ? ? maven { url 'https://jitpack.io' }
? ? ? ? maven { url "https://maven.aliyun.com/repository/public" }
? ? //完整版引入
? ? implementation 'com.github.CarGuo.GSYVideoPlayer:GSYVideoPlayer:v8.3.3-release-jitpack'
? ? //是否需要AliPlayer模式
? ? implementation 'com.github.CarGuo.GSYVideoPlayer:GSYVideoPlayer-aliplay:v8.3.3-release-jitpack'
開發設置
設置 Activity 的 configChanges 和 screenOrientation
<activity android:name=".MainActivity" android:exported="true" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode" android:screenOrientation="fullSensor" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer android:id="@+id/videoPlayer" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
設置要播放的視頻鏈接
videoPlayer = findViewById(R.id.videoPlayer)
videoPlayer.setUp(videoUrl, true, "title")
如果你想添加視頻封面的話,可以這樣設置
val coverImg = ImageView(this)
coverImg.setImageResource(R.drawable.cover)
videoPlayer.thumbImageView = coverImg
具體實現
隱藏自帶的標題和返回鍵
videoPlayer.titleTextView.visibility = View.GONE
videoPlayer.backButton.visibility = View.GONE
設置旋轉,橫屏顯示
orientationUtils = OrientationUtils(this, videoPlayer)
videoPlayer.fullscreenButton.setOnClickListener {
orientationUtils.resolveByClick()
}
開始播放
videoPlayer.startPlayLogic()
除此之外,還需處理一下生命周期
override fun onPause() {
super.onPause()
videoPlayer.onVideoPause()
}
override fun onResume() {
super.onResume()
videoPlayer.onVideoResume()
}
override fun onDestroy() {
super.onDestroy()
GSYVideoManager.releaseAllVideos()
orientationUtils.releaseListener()
}
在橫屏時,如果想點擊返回鍵回到豎屏而不是退出的話,需要重寫 onBackPressed
override fun onBackPressed() {
if (orientationUtils.screenType == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
videoPlayer.fullscreenButton.performClick()
return
}
videoPlayer.setVideoAllCallBack(null)
super.onBackPressed()
}
如果,視頻是以列表的形式展現的話,也是OK的,首先搞個RecyclerView
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".VideoListActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/video_recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
編寫item布局
<?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="wrap_content" android:paddingBottom="30dp"> <com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer android:id="@+id/item_player" android:layout_width="match_parent" android:layout_height="300dp" /> </LinearLayout>
RecyclerView適配器
class VideoAdapter(private val urlList: List<String>, private val context: Context) :
RecyclerView.Adapter<VideoAdapter.ViewHolder>() {
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val itemPlayer: StandardGSYVideoPlayer = view.findViewById(R.id.item_player)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.item_video, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
//配置StandardGSYVideoPlayer
with(holder.itemPlayer) {
setUpLazy(urlList[position], true, null, null, "title")
//隱藏標題和返回鍵
titleTextView.visibility = View.GONE
backButton.visibility = View.GONE
//全屏按鍵
fullscreenButton.setOnClickListener {
holder.itemPlayer.startWindowFullscreen(context, false, true)
}
//防止錯位設置
playPosition = position
//是否根據視頻尺寸,自動選擇橫豎屏全屏
isAutoFullWithSize = true
//音頻焦點沖突時是否釋放
isReleaseWhenLossAudio = false
//全屏動畫
isShowFullAnimation = true
//不能觸摸滑動
setIsTouchWiget(false)
}
}
override fun getItemCount() = urlList.size
}
Activity
val videoRecyclerView = findViewById<RecyclerView>(R.id.video_recyclerView)
val layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
videoRecyclerView.layoutManager = layoutManager
//GlobalUrl.urlList為視頻鏈接集合
val videoAdapter = VideoAdapter(GlobalUrl.urlList, this)
videoRecyclerView.adapter = videoAdapter
videoRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
//可見區域的第一個item
val firstPosition = layoutManager.findFirstVisibleItemPosition()
//可見區域的最后一個item
val lastPosition = layoutManager.findLastVisibleItemPosition()
//播放的位置
val playPosition = GSYVideoManager.instance().playPosition
if (playPosition >= 0) { //說明有播放
if (playPosition < firstPosition || playPosition > lastPosition) {
if (GSYVideoManager.isFullState(this@VideoListActivity)) {
return
}
GSYVideoManager.releaseAllVideos()
videoAdapter.notifyDataSetChanged()
}
}
}
})
別忘了對返回鍵和生命周期的處理哦
override fun onBackPressed() {
super.onBackPressed()
if (GSYVideoManager.backFromWindowFull(this)) {
return
}
super.onBackPressed()
}
override fun onPause() {
super.onPause()
GSYVideoManager.onPause()
}
override fun onResume() {
super.onResume()
GSYVideoManager.onResume()
}
override fun onDestroy() {
super.onDestroy()
GSYVideoManager.releaseAllVideos()
}
原文鏈接:https://blog.csdn.net/qq_45485851/article/details/125805727
相關推薦
- 2022-07-14 Python?socket如何實現服務端和客戶端數據傳輸(TCP)_python
- 2022-06-23 nginx日志格式分析以及修改詳解_nginx
- 2022-04-17 python讀取文件夾下所有文件
- 2022-10-10 Python3?re.search()方法的具體使用_python
- 2022-10-03 React如何實現全屏監聽Esc鍵_React
- 2022-07-07 redis遠程連接不上的解決辦法_Redis
- 2022-10-14 m基于高階累積量和信號子空間的信噪比估計方法的matlab仿真
- 2022-12-15 C語言利用鏈表實現學生成績管理系統_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支