本發(fā)明涉及數(shù)據(jù)視頻播放器,具體涉及一種單例視頻播放器的實(shí)現(xiàn)方法。
背景技術(shù):
目前,市面上的播放器(例如七牛和騰訊)一般是通過(guò)以下流程實(shí)現(xiàn)播放:
(1)將自定義好的播放器視圖放置于布局文件中;
(2)在activity或者fragment中獲取到布局文件中的視圖,獲取到播放器實(shí)例,然后設(shè)置播放器的播放參數(shù)和回調(diào)函數(shù);
(3)控制播放器播放停止;
(4)如果需要進(jìn)行頁(yè)面跳轉(zhuǎn),而保持播放連續(xù),需臨時(shí)保存播放進(jìn)度和播放地址,在跳轉(zhuǎn)后新建一個(gè)播放器,并設(shè)置為臨時(shí)保存的播放地址和播放進(jìn)度,實(shí)現(xiàn)一個(gè)連續(xù)播放。
可見(jiàn),當(dāng)前播放器的實(shí)現(xiàn)都是將播放器視圖直接寫(xiě)到布局文件中,每次播放前都要初始化播放器的參數(shù),如果要在頁(yè)面跳轉(zhuǎn)的時(shí)候連續(xù)播放,例如列表跳轉(zhuǎn)到activity,需要記錄當(dāng)前播放進(jìn)度和播放地址等等參數(shù),在跳轉(zhuǎn)過(guò)后再次為新建的播放器設(shè)置之前記錄的參數(shù)才能播放;雖然能做到連續(xù)播放,但是上一個(gè)頁(yè)面播放的緩存沒(méi)有了,跳轉(zhuǎn)到下一個(gè)頁(yè)面的時(shí)候需要重新加載,導(dǎo)致會(huì)有緩沖的動(dòng)作,影響用戶體驗(yàn),而且如果頁(yè)面持續(xù)跳轉(zhuǎn),不斷實(shí)例化播放器,會(huì)導(dǎo)致內(nèi)存不斷增大,如果內(nèi)存不及時(shí)回收會(huì)導(dǎo)致內(nèi)存溢出。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問(wèn)題是當(dāng)前播放器在連續(xù)播放時(shí),跳轉(zhuǎn)到下一個(gè)頁(yè)面的時(shí),上一個(gè)頁(yè)面緩存已不在,需要重新加載,導(dǎo)致會(huì)有緩沖的動(dòng)作影響用戶體驗(yàn),而且如果頁(yè)面持續(xù)跳轉(zhuǎn),不斷實(shí)例化播放器,會(huì)導(dǎo)致內(nèi)存不斷增大,內(nèi)存不能及時(shí)回收,導(dǎo)致內(nèi)存溢出的問(wèn)題。
為了解決上述技術(shù)問(wèn)題,本發(fā)明所采用的技術(shù)方案是提供一種單例視頻播放器的實(shí)現(xiàn)方法,包括以下步驟:
步驟s10、app啟動(dòng),初始化播放器;
步驟s20、在當(dāng)前頁(yè)面建立一個(gè)framelayout,作為容器放置播放器,將播放器放置于framelayout中,實(shí)現(xiàn)播放;
步驟s30、如果需要跳轉(zhuǎn)且連續(xù)播放,獲取跳轉(zhuǎn)目的頁(yè)面的目的framelayout,跳轉(zhuǎn)時(shí)不停止當(dāng)前頁(yè)面播放器,將當(dāng)前頁(yè)面framelayout中的播放器移動(dòng)到目的framelayout中,并使activity或者fragment繼承接口實(shí)現(xiàn)播放所需的函數(shù)的回調(diào),開(kāi)始連續(xù)播放。
在上述方法中,在步驟s10中,在application的oncreate()方法里調(diào)用videomediacontroller.init()函數(shù)進(jìn)行播放器的初始化的。
在上述方法中,初始化播放器包括:
設(shè)置準(zhǔn)備超時(shí)時(shí)間;
設(shè)置是否在線直播;
設(shè)置緩存大小;
設(shè)置是否開(kāi)啟自動(dòng)播放;
設(shè)置畫(huà)面預(yù)覽模式;
設(shè)置播放器背景顏色。
在上述方法中,步驟s20和步驟s30中framelayout的大小等于預(yù)想的播放器的大小,播放器自適應(yīng)framelayout的大小。
在上述方法中,所述播放所需的函數(shù)包括播放準(zhǔn)備完成回調(diào)函數(shù)、播放進(jìn)度回調(diào)函數(shù)以及播放錯(cuò)誤回調(diào)函數(shù)。
在上述方法中,對(duì)所有播放所需的函數(shù)進(jìn)行了再次封裝,并使activity或者fragment繼承再次封裝的接口。
在上述方法中,跳轉(zhuǎn)目的頁(yè)面獲取目的framelayouta,再調(diào)用videomediacontroller.addvideoviewinholder(a,x)函數(shù),將當(dāng)前頁(yè)面的播放器放置到目的fragmenta當(dāng)中,第二個(gè)參數(shù)(x)控制是否顯示緩沖圖標(biāo),如果需要跳轉(zhuǎn)且連續(xù)播放,將第二個(gè)參數(shù)設(shè)置為false,如果是重新開(kāi)始播放就設(shè)置為true。
在上述方法中,在將當(dāng)前頁(yè)面framelayout中的播放器移動(dòng)到目的framelayout中時(shí),同時(shí)要把一個(gè)實(shí)體類傳入到videomediacontroller中,用于控制播放地址、清晰度選擇;以及通過(guò)videomediacontroller獲取到plvideotextureview播放器對(duì)象,進(jìn)行播放控制。
在上述方法中,步驟s30具體包括以下步驟:
步驟s31、接收跳轉(zhuǎn)播放頁(yè)面請(qǐng)求;
步驟s32、判斷當(dāng)前頁(yè)面是否有播放器,如果有,執(zhí)行步驟s33;否則,執(zhí)行步驟s37;
步驟s33、判斷是否需要連續(xù)播放,如果是執(zhí)行步驟s35;否則,執(zhí)行步驟s34;
步驟s34、停止當(dāng)前頁(yè)面播放器,然后執(zhí)行步驟s36;
步驟s35、不停止當(dāng)前頁(yè)面播放器,然后執(zhí)行步驟s36;
步驟s36、將播放器移出當(dāng)前頁(yè)面的framelayout,然后執(zhí)行步驟s38;
步驟s37、實(shí)例化一個(gè)播放器;
步驟s38、獲取跳轉(zhuǎn)目的頁(yè)面的目的framelayout;
步驟s39、將播放器加入目的framelayout;
步驟s40、activity或者fragment繼承接口實(shí)現(xiàn)回調(diào),實(shí)現(xiàn)播放。
本發(fā)明將播放器當(dāng)做一個(gè)控件來(lái)自由移動(dòng),當(dāng)一個(gè)播放界面跳轉(zhuǎn)到另外一個(gè)播放界面,只把整個(gè)播放器的視圖從之前的界面搬到另外一個(gè)界面,這樣就使得用戶之前緩沖下來(lái)的進(jìn)度不會(huì)丟失,實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)過(guò)程中無(wú)緩沖連續(xù)播放,不僅有較好的用戶體驗(yàn),而且具有以下優(yōu)點(diǎn):
(1)無(wú)需重復(fù)新建播放器,整個(gè)app內(nèi)只有一個(gè)播放器實(shí)例,能動(dòng)態(tài)添加至播放頁(yè)面,減少內(nèi)存申請(qǐng),避免內(nèi)存負(fù)擔(dān)加重,也減少應(yīng)用被系統(tǒng)回收的機(jī)率;
(2)無(wú)需重復(fù)初始化播放器參數(shù),避免開(kāi)發(fā)者重復(fù)寫(xiě)初始化,避免代碼遺留;
(3)由于實(shí)現(xiàn)播放器動(dòng)態(tài)添加,所以能在頁(yè)面跳轉(zhuǎn)過(guò)程中保留緩沖和進(jìn)度跳轉(zhuǎn),實(shí)現(xiàn)無(wú)緩沖、無(wú)卡頓的連續(xù)播放;
(4)播放器的相關(guān)函數(shù)都由一個(gè)控制器控制,實(shí)現(xiàn)播放只需要幾句代碼,其他工作都交給控制器控制;且控制器還實(shí)現(xiàn)了各種回調(diào),只要activity或者fragment繼承接口就能使用。
附圖說(shuō)明
圖1為本發(fā)明提供的一種單例視頻播放器的實(shí)現(xiàn)方法的流程圖;
圖2為本發(fā)明中步驟s30的具體流程圖。
具體實(shí)施方式
本發(fā)明視頻播放進(jìn)行了優(yōu)化,適用于視頻播放客戶端和新聞客戶端,并針對(duì)當(dāng)前播放器在連續(xù)播放時(shí)存在的問(wèn)題,進(jìn)行了相應(yīng)改進(jìn),實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)時(shí)播放器能進(jìn)行無(wú)緩沖連續(xù)播放,減少重復(fù)實(shí)例化播放器導(dǎo)致內(nèi)存增大,與現(xiàn)有技術(shù)相比,本發(fā)明的改進(jìn)主要包括以下幾點(diǎn):
(1)在連續(xù)播放時(shí),現(xiàn)有技術(shù)將自定義好的播放器視圖放置于布局文件中,播放器的頁(yè)面往往是重復(fù)跳轉(zhuǎn),跳轉(zhuǎn)就需要實(shí)例化播放器實(shí)例才能進(jìn)行播放,會(huì)造成不必要的內(nèi)存申請(qǐng);本發(fā)明有播放器的頁(yè)面就無(wú)需將播放器視圖放置于布局文件中,在整個(gè)軟件中只需實(shí)例化一個(gè)實(shí)例,在需要播放的地方實(shí)現(xiàn)動(dòng)態(tài)添加播放器視圖,從而不會(huì)造成不必要的內(nèi)存申請(qǐng)。例如,假如a頁(yè)面要跳轉(zhuǎn)到b頁(yè)面,a和b頁(yè)面都要進(jìn)行視頻播放,在現(xiàn)有技術(shù)中需要在a和b頁(yè)面都放置一個(gè)播放器,當(dāng)進(jìn)行a到b的跳轉(zhuǎn)的時(shí)候,雖然a中的播放器會(huì)回收,但由于java的機(jī)制,回收并不會(huì)及時(shí),所以會(huì)導(dǎo)致軟件申請(qǐng)的內(nèi)存增大,對(duì)于內(nèi)存小的手機(jī)等智能設(shè)備來(lái)說(shuō),這是一個(gè)不小的壓力;而本發(fā)明播放器是動(dòng)態(tài)添加的,所以進(jìn)行a到b跳轉(zhuǎn)時(shí),只需把a(bǔ)中的播放器移到b中即可,這樣就不會(huì)再向系統(tǒng)申請(qǐng)內(nèi)存。
(2)現(xiàn)有技術(shù),連續(xù)播放時(shí)需要記錄當(dāng)前播放進(jìn)度和播放地址等等參數(shù),在跳轉(zhuǎn)過(guò)后再次設(shè)置參數(shù)才能播放;本發(fā)明播放器只需要一次的播放參數(shù)設(shè)置,回調(diào)函數(shù)也是進(jìn)行了再次封裝,只要activity或者fragment繼承回調(diào)接口就可以使用回調(diào),這樣就減少了開(kāi)發(fā)者重復(fù)添加回調(diào)。
(3)在現(xiàn)有技術(shù)中,進(jìn)行連續(xù)播放時(shí),上一頁(yè)面播放的緩存將沒(méi)有,跳轉(zhuǎn)到下一個(gè)頁(yè)面的時(shí)候需要重新加載,且需要保存播放進(jìn)度;本發(fā)明因?yàn)槟軇?dòng)態(tài)添加播放器視圖,且播放器的緩沖和播放進(jìn)度一般都是保存在播放器視圖中,所以動(dòng)態(tài)跳轉(zhuǎn)能實(shí)現(xiàn)緩沖和播放進(jìn)度一起跳轉(zhuǎn),真正實(shí)現(xiàn)無(wú)緩沖連續(xù)播放。
下面為對(duì)本發(fā)明中涉及名詞的解釋:
application,安卓app啟動(dòng)都要初始化的一個(gè)類,相當(dāng)于app中的全局變量;
activity,安卓app中界面的一種,用于界面的展示;
fragment,安卓app中界面的一種,用于界面的展示,通常嵌套在activity中;
videomeidacontroller,本發(fā)明中播放器的控制器,控制播放器動(dòng)態(tài)跳轉(zhuǎn)的工具類,也是控制播放器播放的類;
plvideotextureview,第三方播放器視圖的類;
布局文件,安卓每個(gè)頁(yè)面都有布局文件,用于設(shè)置按鈕,文字等控件的位置和大小
framelayou,層布局,所有放在布局文件里的控件,都按照層次堆疊在屏幕的左上角,后加進(jìn)來(lái)的控件覆蓋前面的控件。
下面結(jié)合說(shuō)明書(shū)附圖和具體實(shí)施例對(duì)本發(fā)明做出詳細(xì)的說(shuō)明。
如圖1所示,本發(fā)明提供了一種單例視頻播放器的實(shí)現(xiàn)方法,包括以下步驟:
步驟s10、app啟動(dòng),初始化播放器;在本發(fā)明中,是在application的app啟動(dòng)方法oncreate()里調(diào)用videomediacontroller.init()函數(shù)(videomediacontroller.init()函數(shù)表示為videomediacontroller調(diào)用videomeidacontroller里面的一個(gè)方法init())進(jìn)行播放器的初始化的;初始化播放器包括:
(1)設(shè)置準(zhǔn)備超時(shí)時(shí)間;
(2)設(shè)置是否在線直播;
(3)設(shè)置緩存大??;
(4)設(shè)置是否開(kāi)啟自動(dòng)播放;
(5)設(shè)置畫(huà)面預(yù)覽模式(包括全屏鋪滿、16:9和4:3等等);
(6)設(shè)置播放器背景顏色。
步驟s20、在需要播放的當(dāng)前頁(yè)面建立一個(gè)framelayout,作為容器放置播放器,將播放器放置于framelayout中,實(shí)現(xiàn)播放;需要注意的是,一定要使用framelayout,不能使用relativelayou和linearlayout,因?yàn)閯?dòng)態(tài)添加播放器的實(shí)現(xiàn)原理是在一個(gè)容器的最上層添加播放器,類似于ps中圖層的效果,而relativelayout和linearlayout無(wú)法實(shí)現(xiàn)這一效果;且framelayout的大小和需要的播放器的大小一樣,因?yàn)椴シ牌魇亲赃m應(yīng)framelayout的大小。
步驟s30、如果需要跳轉(zhuǎn)且連續(xù)播放,跳轉(zhuǎn)目的頁(yè)面建立一個(gè)目的framelayout,跳轉(zhuǎn)時(shí)不停止播放,將當(dāng)前頁(yè)面framelayout中的播放器移動(dòng)到目的framelayout中,并使activity或者fragment繼承接口實(shí)現(xiàn)播放所需的函數(shù)的回調(diào),這里播放所需的函數(shù)包括播放準(zhǔn)備完成回調(diào)函數(shù)、播放進(jìn)度回調(diào)函數(shù)以及播放錯(cuò)誤回調(diào)函數(shù)等,為了避免使用者一個(gè)個(gè)添加上述函數(shù),本發(fā)明對(duì)所有播放所需的函數(shù)進(jìn)行了再次封裝,這樣使用者只需添加一個(gè)已經(jīng)封裝好的接口就可以實(shí)現(xiàn)全部的播放所需的函數(shù)回調(diào),減少重復(fù)添加,方便開(kāi)發(fā)者。
在本發(fā)明中,跳轉(zhuǎn)目的頁(yè)面在播放前獲取到目的framelayouta,然后調(diào)用將播放器視圖添加到framelayout中,且使播放器視圖的大小和容器的大小一樣的函數(shù)videomediacontroller.addvideoviewinholder(a,x),將當(dāng)前頁(yè)面的播放器放置到目的fragmenta當(dāng)中,第二個(gè)參數(shù)(x)控制是否顯示緩沖圖標(biāo),如果是無(wú)緩沖跳轉(zhuǎn)(需要跳轉(zhuǎn)且連續(xù)播放)的話就將第二個(gè)參數(shù)設(shè)置為false,如果是重新開(kāi)始播放就設(shè)置為true,這里的目的framelayout大小設(shè)置為預(yù)想播放的區(qū)域大小,轉(zhuǎn)移過(guò)來(lái)的播放器會(huì)做自適應(yīng)尺寸。
在本發(fā)明中,在將當(dāng)前頁(yè)面framelayout中的播放器移動(dòng)到目的framelayout中時(shí),同時(shí)要把一個(gè)實(shí)體類(即包含播放器播放時(shí)所需信息的集合,例如播放地址、播放標(biāo)題等等信息)傳入到videomediacontroller中,用于控制播放地址、清晰度選擇等等;通過(guò)videomediacontroller獲取到第三方播放器視圖的類plvideotextureview播放器對(duì)象,進(jìn)行播放控制。
在本發(fā)明中,如圖2所示,步驟s30具體包括以下步驟:
步驟s31、接收跳轉(zhuǎn)播放頁(yè)面請(qǐng)求;
步驟s32、判斷當(dāng)前頁(yè)面是否有播放器,如果有,執(zhí)行步驟s33;否則,執(zhí)行步驟s37;
步驟s33、判斷是否需要連續(xù)播放,如果是執(zhí)行步驟s35;否則,執(zhí)行步驟s34;
步驟s34、停止當(dāng)前頁(yè)面播放器,然后執(zhí)行步驟s36;
步驟s35、不停止當(dāng)前頁(yè)面播放器,然后執(zhí)行步驟s36;
步驟s36、將播放器移出當(dāng)前頁(yè)面的framelayout,然后執(zhí)行步驟s38;
步驟s37、實(shí)例化一個(gè)播放器;
步驟s38、獲取跳轉(zhuǎn)目的頁(yè)面的目的framelayout;
步驟s39、將播放器加入目的framelayout;
步驟s40、activity或者fragment繼承接口實(shí)現(xiàn)回調(diào),實(shí)現(xiàn)播放。
顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。