天天看點

我的Android進階之旅------>android視訊播放隻有聲音無畫面的解決辦法

我的Android進階之旅------>android視訊播放隻有聲音無畫面的解決辦法

      今天調試公司用VideoView實作的播放器來播放視訊的時候,隻有聲音輸出而無畫面輸出。一開始以為是自己程式有問題,調試了半天無果。懷疑是真機本身的問題,于是下了幾個第三方的播放器來進行視訊播放,例如:快播、暴風影音、百度視訊和MoboPlayer,都是無疾而終。這更加确定了是真機解碼的問題。

       我的解決方法是:

   1、替換了libstagefright.so庫檔案,因為該檔案被公司的底層人員修改過來适應公司的産品,是以每個公司的該檔案可能不同。

2、然後再重新開機機器

=============================================================

       而Android 的mediaplayer包含audio及video兩部分的播放功能上,單獨的音頻或視訊都是一個系統中的重要組成部分,另外一個就是顯示系統部分在,在android系統最核心的就是SurfaceFlinger元件了。而音視訊也同時存在核心部分:AndioFlinger及Stagefright(OpenCore)做具體的視訊處理工作。

1、代碼位置

   需要從代碼閱讀了解其設計思想,則必須知道其代碼主要目錄

JAVA類的路徑:frameworks/base/media/java/android/media/MediaPlayer.java

JAVA本地調用部分(JNI):frameworks/base/media/jni/<p align="justify">android_media_MediaPlayer.cpp </p>

這部分内容編譯成為目标是libmedia_jni.so。

主要的頭檔案在以下的目錄中:frameworks/base/include/media/

多媒體底層庫在以下的目錄中:frameworks/base/media/libmedia/ 

這部分的内容被編譯成庫libmedia.so。

多媒體服務部分:frameworks/base/media/libmediaplayerservice/ 

檔案為mediaplayerservice.h和mediaplayerservice.cpp 

這部分内容被編譯成庫libmediaplayerservice.so。

 2.2系統目錄:

基于OpenCore的多媒體播放器部分 external/opencore/ 

這部分内容被編譯成庫libopencoreplayer.so。從程式規模上來看,libopencoreplayer.so是主要的實作部分,而其他的庫基本上都是在其上建立的封裝和為建立程序間通訊的機制。

2.3系統目錄:

基于Statefright的多媒體播放器部分 frameworks\base\media\libstagefright

這部分内容被編譯成庫 libstagefright.so。從程式規模上來看,libstagefright.so是主要的實作部分,而其他的庫基本上都是在其上建立的封裝和為建立程序間通訊的機制。

       由于編寫的視訊播放器最終都是調用系統的MediaPlayer來進行播放,而視訊解碼方式有軟解碼和硬解碼兩種方式,關于這兩種編碼方式看下文。

硬解碼和軟解碼的差別

什麼是“軟解碼”,什麼又是“硬解碼”呢?

  我們在計算機上播放的視訊檔案都是經過壓縮的,因為這樣有利于節約存儲空間;那麼在播放過程,就需要進行一個反射的解壓縮過程。在以前這項工作都是由CPU來完成的,對于普通分辨率的AVI、RMVB等檔案,絕大多數的CPU都可以勝任;但是發展到高清視訊(1080i/p)之後,資料解壓縮的工作量比以前翻了數倍,這讓很多處理器叫苦不疊。

  随着技術的發展,工程師們發現顯示卡的GPU/VPU要比CPU更适合這類大資料量的、低難度的重複工作。視訊解碼工作從處理器那裡分離出來,交給顯示卡去做,這就叫做“硬解碼”,例如NVDIA的PureVideo、AMD的UVD技術等等;與之對應的,以前那種純粹依靠CPU來講稿的方式則是“軟解碼”。不過受到技術條件的限制,純粹的“硬解碼”在現階段是不存在的,CPU依然在發揮一部分作用,隻不過硬解碼時GPU/VPU已經成為運算的主力。

硬解碼都有哪些好處?

  很多使用老電腦的朋友都有這樣的體會,播放高清視訊時畫面會卡得跳幀(就跟看幻燈片一樣),聲音也是斷斷續續的;但解碼工作交給新顯示卡後,CPU就可以解放出來做更多的事情,與此同時還降低了整機功耗,風扇也不至于“呼呼”作響……

為什麼現在又有很多人熱衷于軟解碼呢?

  硬解碼雖好,但是其中複雜的設定過程也隻有少數發燒友才玩得轉,很多入門使用者面對複雜的設定選項就如同看天書一般,根本不知道如何下手。而且随着處理器恨不能的不斷提升,現在就算是主流的雙核産品,也能達到軟解碼的需求,在此基礎上軟解碼又受到很多人的青睐。簡單、易用是軟解碼最大的優勢,而且在現階段軟解碼在畫質上要更好一些。

老鳥指點迷津

  “三十年河東,三十年河西”,以前我們很多人都認為硬解碼要更好一些,但是現在我們建議是:對于那些仍在使用老機器,或者動手能力比較高的使用者,推薦硬解碼;反之,對于普通使用者而言,如果你的機器性能已經足夠,使用軟解碼也未嘗不可,不用苛求一定要“玩硬的”。

  摘自《微型計算機》

  作者:歐陽鵬  歡迎轉載,與人分享是進步的源泉!

繼續閱讀