Vitamio 填坑之路

    項目跟教育有關,那麼就免不了跟視頻打交道,之前的APP用的是安卓提供的原生的播放器,項目前期只是進行了簡單的封裝。
    後期由於不斷的添加各種各樣的功能(清晰度切換,線路切換,添加講義,網絡視頻和本地下載視頻切換播放,記憶播放,續播等等)。
    到目前爲止已將近5000行代碼(呵呵,TM除了老子,誰還看得懂)。
上個APP搞定後,不少學員強烈要求要視頻可以倍速播放,我擦,IOS還好說(他們自帶倍速播放),安卓嘛,就坑了!
視頻倍速播放需要涉及到編解碼(我TM是個搞Java的啊),沒辦法只能求助萬能的互聯網了!找了幾個開源的視頻播放器,最後定在另外VLC和Vitamio。
VLC看了半天,各種編譯,想我這種菜鳥想搞也是沒什麼希望了。看了看Vitamio,Java層的代碼還是蠻簡單的,最新的版本是16年10月份的,有搞頭!
下了Demo,找了項目中播放地址,加上防盜鏈,Run一下,OK,沒問題!很好!按照文檔設置播放速度,設到2.0倍速也能播放。
唯一不好的地方是音頻和圖像並不是很同步(絕大部分情況會出現,播放本地視頻OK的),音頻和圖像大概有2到5秒的時差!(雖然不完美,還是可以接受的 =3=)。

開始整合項目:

    1.導入Vitamio的依賴工程。

(1)在Eclipse中的Demo跑通後,左鍵InitActivity項目,Export帶.gradle文件。
(2)Android studio 的File ---->new----->Import Module 導入剛纔導出的InitActivity依賴工程(導入之後可能在InitActivity的build.gradle文件中出錯。
一般情況是編譯版本之類的錯,你將你原工程對應文件的相對應的配置copy過去,再重新編譯一下就OK了)

導出依賴工程
Android studio導入依賴工程

    2.開始編寫InitActivity中相應的代碼(原InitActivity中的進度條醜的一逼,我們需要修改)。
    需要注意的地方就是控制條中各個組件對應的ID。還需要添加的按鈕,就仿照着他的方式繼續添加就OK了。
    最後加完之後的點擊事件,你可以寫接口在VideoView類中進行實現,或者暴露方法,在你自己的代碼中實現(我是這種方式)。

修改後的MediaControler佈局
原依賴工程中的註解,大意就是自己在定義控制器的時候,暫停/播放,進度條,視頻名稱這三個控件的ID不能改,必須是使用Vitamio定義好的

    3.底部控制器的佈局搞定之後就是播放器的實施了(按照Demo來,一般都可以正常的播放)


    4.下面就開始填坑了。


    (1)seekTo(long msec)如果你的播放器有記憶播放(用戶播放到一半,退出去了,下次進來從上次那個播放點開始播放),這個就是一個小坑。


這是VideoView中提供的seekTo方法
public void seekTo(long msec) {
    if (isInPlaybackState()) {
        android.util.Log.e("qqqqq",msec+"<--------------");
      mMediaPlayer.seekTo(msec);
      mSeekWhenPrepared = 0;
    } else {
        android.util.Log.e("ppppp",msec+"<--------------");
      mSeekWhenPrepared = msec;
    }
  }
Vitamio的官方文檔告訴我們說,在以下這個接口seekTo()到你指定的播放地點了
public void setOnPreparedListener(OnPreparedListener l) {
  mOnPreparedListener = l;
}
然而,你調用之後並沒有什麼卵用,進度條確實向後跳了,但是很短的時間後又從頭開始播放了。打斷點,輸出日誌,看源碼,對呀,並沒有什麼錯啊!
怎麼不跳呢!
呵呵,我的猜測是seekTo的調用應該是視頻已經開始播放的時候才起作用。
也就是說OnpreparedListener的監聽並沒有監聽的很準確,也就是監聽到視屏要開始播放了,
但是並沒有播放,這時候開始seek的話,並沒有起作用(也可能是機型的問題,我的測試機是華爲EMUI)。
我的解決辦法是在OnpreparedListener監聽後的500ms後再seek,成功了!

handler推遲0.5秒發送seek動作

(2)public void setVideoLayout(int layout, float aspectRatio)
根據文檔的描述,這個方法是設置播放界面的尺寸和視頻的寬高比例的。
在華爲的機子上跑的很順,橫屏跟豎屏切換的時候並沒有出現什麼問題。
但是在小米(測試機用的4c ,note1),還有部分華爲的機子上就出現了。
橫屏時,不能填充父控件(其實填充了,你可以重寫OnTouch方法進行識別),只佔了播放的畫布一部分。
測試之後發現其實是此方法中的getHolder().setFixedSize(mSurfaceWidth, mSurfaceHeight);

**mSurfaceWidth和mSurfaceHeight並沒有發生變化**

這是方法體

setVideoLayout的方法體

解決的方案就是(重新定義一個方法,在佈局發生變化的時候傳入寬高進行重新設置):

public void setVedioLayout(int width,int height){
    LayoutParams lp = getLayoutParams();
    ViewGroup parent = (ViewGroup) getParent();
    lp.width = width;
    lp.height = height;
    Log.e("VIDEO3=====",lp.width+"============"+ lp.height);
    setLayoutParams(lp);
    getHolder().setFixedSize(width,  height);
}
(3)手機測試時是沒有任何問題的,項目到目前爲止很順利。開始進行pad適配工作。問題又來了
dlopen failed: "libstlport_shared.so" has unexpected e_machine: 183
(當時很鬱悶,手機沒問題,官方Demo沒問題,就整合到自己的項目中出現這種問題)
右邊的框框中的so文件加載不到

MeddiaPlayer類

這個是Android studio導入工程後的配置問題。
需要在build.gradle加入下面的配置

ndk配置

還需要在gradle.properties配置一下這個

這裏寫圖片描述

**注意的是都都是在你自己的工程中,而不是在依賴工程中。**

(3)最後一個問題並沒有深究,估計也深究不出什麼玩意!
FIND_NAME_SYM vvo, render_yuv #82
這個錯誤,報出來後APP並不崩潰,進度條上的視頻總時長也沒有什麼問題!
但是!但是。。。它是黑屏的狀態。加了Vitamio的技術交流羣,看到有大牛說是機器渲染的問題,應該是什麼方法搞反了。
我的解決方法是偶然測試出來的。具體是怎麼回事,我也是不太明白!目前項目就先這樣搞了!有問題再扯!
解決的方案是把對VideoView的錯誤監聽事件和信息變化事件去掉就OK了(我的項目確實是這樣解決了)!

這裏寫圖片描述

好了,就扯到這了!有什麼扯得不對的地方,希望大家指正!共同進步!

發佈了32 篇原創文章 · 獲贊 42 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章