Android多功能視頻播放器GSYVideoPlayer開發(fā)流程
前言
今天,和大家分享一個(gè)開源的多功能視頻播放器 — GSYVideoPlayer,支持彈幕,濾鏡、水印、gif截圖,片頭廣告,聲音、亮度調(diào)節(jié)等眾多功能,這里就利用它來(lái)實(shí)現(xiàn)一個(gè)標(biāo)準(zhǔn)的視頻播放器,那么,話不多說(shuō),Go ~
GSYVideoPlayer 一個(gè)基于IJkPlayer的播放器
支持調(diào)節(jié)聲音亮度
邊播邊緩存 使用了AndroidVideoCache;ExoPlayer使用SimpleCache
支持多種協(xié)議h263\4\5、Https、concat、rtsp、hls、rtmp、crypto、mpeg等等
簡(jiǎn)單濾鏡(馬賽克、黑白、色彩過(guò)濾、高斯、模糊、模糊等等20多種)、動(dòng)畫、(水印、畫面多重播放等)
視頻第一幀、視頻幀截圖功能,視頻生成gif功能。
調(diào)整顯示比例:默認(rèn)、16:9、4:3、填充;播放時(shí)旋轉(zhuǎn)畫面角度(0,90,180,270);鏡像旋轉(zhuǎn)
IJKPlayer、EXOPlayer、MediaPlayer切換、自定義內(nèi)核
小窗口、多窗體下(包括桌面)的小窗口播放。
片頭廣告、跳過(guò)廣告支持、中間插入廣告功能。
暫停前后臺(tái)切換不黑屏;調(diào)整不同清晰度的支持;無(wú)縫切換支持;鎖定/解鎖全屏點(diǎn)擊功能;進(jìn)度條小窗口預(yù)覽
可自定義渲染層、自定義管理層、自定義播放層(控制層)、自定義緩存層
引入依賴
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'
開發(fā)設(shè)置
設(shè)置 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>設(shè)置要播放的視頻鏈接
videoPlayer = findViewById(R.id.videoPlayer)
videoPlayer.setUp(videoUrl, true, "title")
如果你想添加視頻封面的話,可以這樣設(shè)置
val coverImg = ImageView(this)
coverImg.setImageResource(R.drawable.cover)
videoPlayer.thumbImageView = coverImg
具體實(shí)現(xiàn)
隱藏自帶的標(biāo)題和返回鍵
videoPlayer.titleTextView.visibility = View.GONE
videoPlayer.backButton.visibility = View.GONE
設(shè)置旋轉(zhuǎn),橫屏顯示
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()
}在橫屏?xí)r,如果想點(diǎn)擊返回鍵回到豎屏而不是退出的話,需要重寫 onBackPressed
override fun onBackPressed() {
if (orientationUtils.screenType == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
videoPlayer.fullscreenButton.performClick()
return
}
videoPlayer.setVideoAllCallBack(null)
super.onBackPressed()
}如果,視頻是以列表的形式展現(xiàn)的話,也是OK的,首先搞個(gè)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")
//隱藏標(biāo)題和返回鍵
titleTextView.visibility = View.GONE
backButton.visibility = View.GONE
//全屏按鍵
fullscreenButton.setOnClickListener {
holder.itemPlayer.startWindowFullscreen(context, false, true)
}
//防止錯(cuò)位設(shè)置
playPosition = position
//是否根據(jù)視頻尺寸,自動(dòng)選擇橫豎屏全屏
isAutoFullWithSize = true
//音頻焦點(diǎn)沖突時(shí)是否釋放
isReleaseWhenLossAudio = false
//全屏動(dòng)畫
isShowFullAnimation = true
//不能觸摸滑動(dòng)
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)
//可見區(qū)域的第一個(gè)item
val firstPosition = layoutManager.findFirstVisibleItemPosition()
//可見區(qū)域的最后一個(gè)item
val lastPosition = layoutManager.findLastVisibleItemPosition()
//播放的位置
val playPosition = GSYVideoManager.instance().playPosition
if (playPosition >= 0) { //說(shuō)明有播放
if (playPosition < firstPosition || playPosition > lastPosition) {
if (GSYVideoManager.isFullState(this@VideoListActivity)) {
return
}
GSYVideoManager.releaseAllVideos()
videoAdapter.notifyDataSetChanged()
}
}
}
})別忘了對(duì)返回鍵和生命周期的處理哦
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()
}
到此這篇關(guān)于Android多功能視頻播放器GSYVideoPlayer開發(fā)流程的文章就介紹到這了,更多相關(guān)Android GSYVideoPlayer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 谷歌推薦的VR實(shí)現(xiàn)方式(分享)
下面小編就為大家分享一篇Android 谷歌推薦的VR實(shí)現(xiàn)方式。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
百度地圖實(shí)現(xiàn)小車規(guī)劃路線后平滑移動(dòng)功能
這篇文章主要介紹了百度地圖實(shí)現(xiàn)小車規(guī)劃路線后平滑移動(dòng)功能,本文是小編寫的一個(gè)demo,通過(guò)效果圖展示的非常直白,需要的朋友可以參考下2020-01-01
Android實(shí)現(xiàn)從相冊(cè)選擇照片功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)從相冊(cè)選擇照片功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Android編程之Button控件配合Toast控件用法分析
這篇文章主要介紹了Android編程之Button控件配合Toast控件用法,結(jié)合實(shí)例形式分析了Button控件及Toast控件的功能及具體使用技巧,需要的朋友可以參考下2015-12-12
Flutter集成高德地圖并添加自定義Maker的實(shí)踐
本文主要介紹了Flutter集成高德地圖并添加自定義Maker的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Android Studio OkHttpClient使用教程詳解
這篇文章主要介紹了Android Studio OkHttpClient使用教程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Android自定義ViewGroup嵌套與交互實(shí)現(xiàn)幕布全屏滾動(dòng)
這篇文章主要為大家介紹了Android自定義ViewGroup嵌套與交互實(shí)現(xiàn)幕布全屏滾動(dòng)效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android Messenger實(shí)現(xiàn)進(jìn)程間雙向通信
這篇文章主要為大家詳細(xì)介紹了Messenger實(shí)現(xiàn)進(jìn)程間雙向通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
OpenGL中的glutInitDisplayMode()函數(shù)的理解
今天小編就為大家分享一篇關(guān)于OpenGL中的glutInitDisplayMode()函數(shù)的理解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04

