android視頻播放器api,03.視頻播放器Api說明

03.視頻播放器Api說明

目錄介紹01.最簡單的播放

02.如何切換視頻內核

03.切換視頻模式

04.切換視頻清晰度

05.視頻播放監聽

06.列表中播放處理

07.懸浮窗口播放

08.其他重要功能Api

09.播放多個視頻

10.VideoPlayer相關Api

11.Controller相關Api

12.邊播放邊緩存api

13.類似抖音視頻預加載

14.視頻播放器埋點

00.視頻播放器通用框架基礎封裝視頻播放器player,可以在ExoPlayer、MediaPlayer,聲網RTC視頻播放器內核,原生MediaPlayer可以自由切換

對于視圖狀態切換和后期維護拓展,避免功能和業務出現耦合。比如需要支持播放器UI高度定制,而不是該lib庫中UI代碼

針對視頻播放,音頻播放,播放回放,以及視頻直播的功能。使用簡單,代碼拓展性強,封裝性好,主要是和業務徹底解耦,暴露接口監聽給開發者處理業務具體邏輯

該播放器整體架構:播放器內核(自由切換) + 視頻播放器 + 邊播邊緩存 + 高度定制播放器UI視圖層

01.最簡單的播放必須需要的四步驟代碼如下所示//創建基礎視頻播放器,一般播放器的功能 BasisVideoController controller = new BasisVideoController(this); //設置控制器 mVideoPlayer.setVideoController(controller); //設置視頻播放鏈接地址 mVideoPlayer.setUrl(url); //開始播放 mVideoPlayer.start(); ```- 開始播放

//播放視頻 videoPlayer.start(); `

02.如何切換視頻內核創建視頻播放器PlayerFactory playerFactory = IjkPlayerFactory.create(); IjkVideoPlayer ijkVideoPlayer = (IjkVideoPlayer) playerFactory.createPlayer(this); PlayerFactory playerFactory = ExoPlayerFactory.create(); ExoMediaPlayer exoMediaPlayer = (ExoMediaPlayer) playerFactory.createPlayer(this); PlayerFactory playerFactory = MediaPlayerFactory.create(); AndroidMediaPlayer androidMediaPlayer = (AndroidMediaPlayer) playerFactory.createPlayer(this); ```- 如何配置視頻內核

//播放器配置,注意:此為全局配置,例如下面就是配置ijk內核播放器 VideoViewManager.setConfig(VideoPlayerConfig.newBuilder() .setLogEnabled(true)//調試的時候請打開日志,方便排錯 .setPlayerFactory(IjkPlayerFactory.create()) .build()); `- 切換視頻內核處理代碼

03.切換視頻模式關于全屏模式相關api//進入全屏 mVideoPlayer.startFullScreen(); //退出全屏 mVideoPlayer.stopFullScreen(); ```- 關于小窗口播放相關api

//開啟小屏 mVideoPlayer.startTinyScreen(); //退出小屏 mVideoPlayer.stopTinyScreen(); `

04.切換視頻清晰度

05.視頻播放監聽這個分為兩部分:第一部分是播放模式監聽,第二部分是播放狀態監聽,暴露給開發者。這里不建議使用0,1,非常不方便簡明之意,采用注解限定。mVideoPlayer.setOnStateChangeListener(new OnVideoStateListener() { /** * 播放模式 * 普通模式,小窗口模式,正常模式三種其中一種 * MODE_NORMAL 普通模式 * MODE_FULL_SCREEN 全屏模式 * MODE_TINY_WINDOW 小屏模式 * @param playerState 播放模式 */ @Override public void onPlayerStateChanged(int playerState) { switch (playerState) { case ConstantKeys.PlayMode.MODE_NORMAL: //普通模式 break; case ConstantKeys.PlayMode.MODE_FULL_SCREEN: //全屏模式 break; case ConstantKeys.PlayMode.MODE_TINY_WINDOW: //小屏模式 break; } } /**

06.在列表中播放第一步:初始化視頻播放器,創建VideoPlayer對象mVideoView = new VideoPlayer(context); mVideoView.setOnStateChangeListener(new VideoPlayer.SimpleOnStateChangeListener() { @Override public void onPlayStateChanged(int playState) { //監聽VideoViewManager釋放,重置狀態 if (playState == ConstantKeys.CurrentState.STATE_IDLE) { PlayerUtils.removeViewFormParent(mVideoView); mLastPos = mCurPos; mCurPos = -1; } } }); mController = new BasisVideoController(context); mVideoView.setController(mController); ```- 第二步:設置RecyclerView和Adapter

mAdapter.setOnItemChildClickListener(new OnItemChildClickListener() { @Override public void onItemChildClick(int position) { //點擊item播放視頻 startPlay(position); } }); mRecyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() { @Override public void onChildViewAttachedToWindow(@NonNull View view) { }@Override

public void onChildViewDetachedFromWindow(@NonNull View view) { FrameLayout playerContainer = view.findViewById(R.id.player_container); View v = playerContainer.getChildAt(0); if (v != null && v == mVideoView && !mVideoView.isFullScreen()) { //銷毀視頻 releaseVideoView(); } } }); `- 第三步:播放視頻和銷毀視頻的邏輯代碼/** * 開始播放 * @param position 列表位置 */ protected void startPlay(int position) { if (mCurPos == position) return; if (mCurPos != -1) { releaseVideoView(); } VideoInfoBean videoBean = mVideos.get(position); mVideoView.setUrl(videoBean.getVideoUrl()); View itemView = mLinearLayoutManager.findViewByPosition(position); if (itemView == null) return; VideoRecyclerViewAdapter.VideoHolder viewHolder = (VideoRecyclerViewAdapter.VideoHolder) itemView.getTag(); //把列表中預置的PrepareView添加到控制器中,注意isPrivate此處只能為true。 mController.addControlComponent(viewHolder.mPrepareView, true); PlayerUtils.removeViewFormParent(mVideoView); viewHolder.mPlayerContainer.addView(mVideoView, 0); //播放之前將VideoView添加到VideoViewManager以便在別的頁面也能操作它 VideoViewManager.instance().add(mVideoView, "list"); mVideoView.start(); mCurPos = position; } private void releaseVideoView() {

08.其他重要功能Api設置視頻播放器背景圖,和視頻標題。//注意,下面這個controller是指BasisVideoController //設置視頻背景圖 ImageView thumb = controller.getThumb(); Glide.with(this).load(R.drawable.image_default).into(controller.getThumb()); //設置視頻標題 controller.setTitle("視頻標題"); ```- 判斷是否鎖屏

//判斷是否鎖屏 boolean locked = controller.isLocked(); //設置是否鎖屏 controller.setLocked(true); `- 設置播放視頻縮放類型。借鑒于網絡博客,類似圖片縮放。建議選擇16:9類型,最常見

09.播放多個視頻這個舉一個例子,比如同時播放兩個視頻,當然這種情況在app中可能比較少//必須設置 player1.setUrl(VOD_URL_1); VideoPlayerBuilder.Builder builder = VideoPlayerBuilder.newBuilder(); builder.setEnableAudioFocus(false); VideoPlayerBuilder videoPlayerBuilder = new VideoPlayerBuilder(builder); player1.setVideoBuilder(videoPlayerBuilder); BasisVideoController controller1 = new BasisVideoController(this); player1.setController(controller1); mVideoViews.add(player1); //必須設置

player2.setUrl(VOD_URL_2); VideoPlayerBuilder.Builder builder2 = VideoPlayerBuilder.newBuilder(); builder.setEnableAudioFocus(false); VideoPlayerBuilder videoPlayerBuilder2 = new VideoPlayerBuilder(builder2); player2.setVideoBuilder(videoPlayerBuilder2); BasisVideoController controller2 = new BasisVideoController(this); player2.setController(controller2); mVideoViews.add(player2); ```- 那么要是頁面切換到后臺,如何處理多個視頻的暫停功能呢?如下所示:

@Override protected void onPause() { super.onPause(); for (VideoPlayer vv : mVideoViews) { vv.pause(); } } @Override

protected void onResume() { super.onResume(); for (VideoPlayer vv : mVideoViews) { vv.pause(); } } @Override

protected void onDestroy() { super.onDestroy(); for (VideoPlayer vv : mVideoViews) { vv.release(); } } @Override

public void onBackPressed() { for (VideoPlayer vv : mVideoViews) { if (vv.onBackPressed()) return; } super.onBackPressed(); } `

10.VideoPlayer相關Api關于視頻播放相關的api如下所示//暫停播放 mVideoPlayer.pause(); //視頻緩沖完畢,準備開始播放時回調 mVideoPlayer.onPrepared(); //重新播放 mVideoPlayer.replay(true); //繼續播放 mVideoPlayer.resume(); //調整播放進度 mVideoPlayer.seekTo(100); //循環播放, 默認不循環播放 mVideoPlayer.setLooping(true); //設置播放速度 mVideoPlayer.setSpeed(1.1f); //設置音量 0.0f-1.0f 之間 mVideoPlayer.setVolume(1,1); //開始播放 mVideoPlayer.start(); ```- 關于視頻切換播放模式相關api

//判斷是否處于全屏狀態 boolean fullScreen = mVideoPlayer.isFullScreen(); //是否是小窗口模式 boolean tinyScreen = mVideoPlayer.isTinyScreen(); //進入全屏 mVideoPlayer.startFullScreen(); //退出全屏 mVideoPlayer.stopFullScreen(); //開啟小屏 mVideoPlayer.startTinyScreen(); //退出小屏 mVideoPlayer.stopTinyScreen(); `- 關于其他比如獲取速度,音量,設置屬性相關Api

11.Controller相關ApiController控制器相關的Api說明

12.邊播放邊緩存api如下所示

13.類似抖音視頻預加載如下所示,這個是針對ViewPager//獲取PreloadManager預加載管理者對象 mPreloadManager = PreloadManager.getInstance(this); //在播放視頻的時候 String playUrl = mPreloadManager.getPlayUrl(url); VideoLogUtils.i("startPlay: " + "position: " + position + " url: " + playUrl); mVideoPlayer.setUrl(playUrl); //在頁面滾動的時候 mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageScrollStateChanged(int state) { super.onPageScrollStateChanged(state); if (state == VerticalViewPager.SCROLL_STATE_IDLE) { mPreloadManager.resumePreload(mCurPos, mIsReverseScroll); } else { mPreloadManager.pausePreload(mCurPos, mIsReverseScroll); } } }); ```- 如下所示,這個是針對RecyclerView

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { /* 是否反向滑動 */ private boolean mIsReverseScroll; @Override

public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (dy>0){ //表示下滑 mIsReverseScroll = false; } else { //表示上滑 mIsReverseScroll = true; } } @Override

public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == VerticalViewPager.SCROLL_STATE_IDLE) { mPreloadManager.resumePreload(mCurPos, mIsReverseScroll); } else { mPreloadManager.pausePreload(mCurPos, mIsReverseScroll); } } }); `

14.視頻播放器埋點代碼如下所示,寫一個類,實現BuriedPointEvent即可。即可埋點視頻的播放次數,播放進度,點擊視頻廣告啥的,方便統一管理public class BuriedPointEventImpl implements BuriedPointEvent {

/** * 進入視頻播放 * @param url 視頻url */ @Override public void playerIn(String url) {

} /**

* 退出視頻播放 * @param url 視頻url */ @Override public void playerDestroy(String url) {

}

/** * 視頻播放完成 * @param url 視頻url */ @Override public void playerCompletion(String url) {

}

/** * 視頻播放異常 * @param url 視頻url * @param isNetError 是否是網絡異常 */ @Override public void onError(String url, boolean isNetError) {

}

/** * 點擊了視頻廣告 * @param url 視頻url */ @Override public void clickAd(String url) {

}

/** * 退出視頻播放時候的播放進度百度分 * @param url 視頻url * @param progress 視頻進度,計算百分比【退出時候進度 / 總進度】 */ @Override public void playerOutProgress(String url, float progress) {

}

/** * 視頻切換音頻 * @param url 視頻url */ @Override public void videoToMedia(String url) {

}}

15.播放器示例展示圖

1460000037479524

1460000037479526

1460000037479527

1460000037479527

1460000037479529

1460000037479530

1460000037479531

1460000037479534

1460000037479532

1460000037479533

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397404.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397404.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397404.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Python重命名MP3標簽

從Window復制MP3文件的到Ubuntu下,MP3標簽很多是亂碼。于是想自己寫個Python程序處理一下。 從酷狗復制過來的音樂文件名都是“作者 - 標題”,所以可以通過解析文件名直接獲取作者和標題信息。 需要下載eyeD3模塊 $ sudo apt-get install python-eyed3 代…

Taurus.MVC 2.0 開源發布:WebAPI開發教程

背景: 有用戶反映,Tausus.MVC 能寫WebAPI么? 能! 教程呢? 嗯,木有! 好吧,剛好2.0出來,就帶上WEBAPI教程了! 開源地址: https://github.com/cyq116…

android 鎖屏 home,android 鎖屏界面禁用長按home 和menu(recent apps)

android 5.1 系統中public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {//檢查當前是否鎖屏, 可以添加getTopApp()判斷當前activity 來屏蔽2398 final boolean keyguardOn keyguardOn();添加新的方法://獲…

Chrome瀏覽器調試踩坑

Chrome瀏覽器若在響應式狀態下,頁面縮放比例不是100%,元素會“竄位”,點擊元素會點擊到元素周圍的元素 Chrome頁面縮放比例不為100%時,table的單元格就算沒有邊框(CSS去掉了)也會顯示出邊框(縫隙…

WordPress 博客文章時間格式the_time()設置

國外設計的WordPress 主題里的文章的時間格式是類似“十一月 21, 2010”這種格式的,而中國人習慣的是年在前,月緊跟其后,日在末尾,所以看國外的就顯得很別扭,但是我們可以通過修改WP時間代碼來設置成為我們中國人習慣的…

linux yum

更改linux YUM源方法:第一步:進入yum配置文件目錄:cd /etc/yum.repos.d/第二步:備份配置文件:mv CentOS-Base.repo CentOS-Base.repo.bak第三步:下載網易的配置(或其他源配置文件)&a…

chrome瀏覽器去掉緩存的方法

方法一: 1.開發說打開開發者工具 勾選這個訪問可以 方法二: commandshiftR 轉載于:https://www.cnblogs.com/kaibindirver/p/9378572.html

Apache Tomcat目錄下各個文件夾的作用

1.bin:存放各種不同平臺開啟與關閉Tomcat的腳本文件。 2.lib:存tomcat與web應用的Jar包。 3.conf:存放tomcat的配置文件。 4.webapps:web應用的發布目錄。 5.work:tomcat把由各種jsp生成的servlet文件存放的地方。 6.l…

sony z2 android 5.0,索尼Xperia Z2 5.0 root教程_索尼Z2獲取5.0系統的root

來說一下咱們的索尼Xperia Z2手機的5.0系統的root,因為現在很多機友的系統是5.0的,可是對于5.0的系統很多機友還不知道如何進行root操作,之前的針對4.4的系統的root方法肯定是用不到5.0的系統上的,因此需要專門的針對5.0的root軟件…

ABP文檔 - Javascript Api - AJAX

本節內容: AJAX操作相關問題ABP的方式 AJAX 返回信息處理錯誤 HTTP 狀態碼WrapResult和DontWrapResult特性 Asp.net Mvc 控制器Asp.net Web Api 控制器動態Web Api層Asp.net Core 控制器動態Web Api層AJAX操作相關問題 執行一個AJAX調用在現在的應用里非常常見&…

視達配色教程17 灰色的色彩意象是什么

視達配色教程17 灰色的色彩意象是什么 一、總結 一句話總結:沒有個性的色彩 1、灰色的一般意象是什么? 所有混沌的情感不友好的色彩可怕、恐怖和殘忍感情貧乏或者內向年齡和年老遺忘的過去貧困與謙虛劣等的顏色秘密與非法合適的中等-男式時裝的標準 二、…

AngularJs 相應回車事件

最近做項目,要用到AngularJs,之前也有用過一點點,但僅限于數據的綁定,這次項目要整個前端需要使用這個框架,可能是不熟悉的原因,感覺這代碼搞起來非常的不便利,;現總結一個響應回車事…

android6流暢,Android應用流暢(Seamlessness)設計

即使你的應用程序是快速且響應靈敏的,但一些設計仍然會給用戶造成問題——與其它應用程序或對話框未事先計劃的交互,意外的數據丟失,意料之外的阻塞等 等。避免這些問題,有助于理解應用程序運行的上下文和系統的交互過程&#xff…

stack overflow--技術問答網站

轉自:http://baike.baidu.com/link?urleMR6Pwdk9IkauI5B3nZb2Yo3VUAcK6vQfrMpcSMPWqgH0ngqFkup3Gdr3t_s_yZe_UFwkR8c1pboaxhEuY-iwF_nGiUYHajEPMO6Y1kqWvT8aPz7a_T6t3a1vxyTccgKl_UIx1cU-6IP7qjre2ijtq Stack Overflow是一個與程序相關的IT技術問答網站。用戶可以在…

8782:乘積最大

【題目描述】 有一個長度為N的數字串,要求選手使用K個乘號將它分成K1個部分,找出一種分法,使得這K1個部分的乘積能夠為最大。 【題目鏈接】 http://noi.openjudge.cn/ch0206/8782/ 【算法】 決策過程:決策插入第i個乘號的位置使插…

uvalive 4973 Ardenia

題意&#xff1a;給出空間兩條線段&#xff0c;求距離。 注意輸出格式&#xff01; 1 #include<cstdio>2 #include<cmath>3 #include<algorithm>4 using namespace std;5 6 struct Point37 {8 int x, y, z;9 Point3(int x0, int y0, int z0):x(x),y(…

rz和sz上傳下載文件

安裝軟件包 yum install lrzsz 上傳文件&#xff0c;輸入rz選擇文件上傳(可以按住shift鍵多選) # rz sz 下載文件到本地&#xff0c;選擇保存文件夾 # sz dd xshell設置默認上傳下載文件夾 轉載于:https://www.cnblogs.com/fcing/p/9382377.html

上班第一天(6)--一個程序員的成長史(15)

走出公司大門口之后&#xff0c;代是雄看到很多人都朝著一個方向走去。代是雄比較納悶&#xff0c;于是便問保安這是什么情況。“你是新來的吧&#xff1f;連這個都不知道嗎&#xff1f;”保安似乎不屑于回答新人的問題。“我是新來的實習生&#xff0c;”代是雄壓制住了心中的…

自學Java匯報(3)

本周自學Java總結&#xff1a; 繼承語法、成員變量的隱藏和方法的覆蓋、super、final、多態、組合于繼承、初始化順序、部分抽象類。 總用時八小時&#xff0c;編程兩小時。 下周目標&#xff1a;接口、枚舉、異常。轉載于:https://www.cnblogs.com/lianghang/p/9384793.html

怎樣在html中設置首字母大寫,javascript如何設置字符串首字母大寫?

給出一個字符串&#xff0c;如何確保字符串的首字母都大寫&#xff1f;下面本篇文章就來給大家介紹一下使用javascript設置首字母大寫的方法&#xff0c;希望對大家有所幫助。在javascript中&#xff0c;可以使用slice()方法、toUpperCase()方法和toLowerCase()方法來設置首字母…