1. 程式人生 > >我的Android進階之旅------>android視訊播放只有聲音無畫面的解決辦法

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

     

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

       我的解決方法是:

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

adb push libstagefright.so /system/lib

2、然後再重啟機器
adb reboot


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

       更多關於libstagefright.so的介紹可以參考下文。http://blog.csdn.net/andyhuabing/article/details/7861648

       而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就可以解放出來做更多的事情,與此同時還降低了整機功耗,風扇也不至於“呼呼”作響……

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

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

老鳥指點迷津

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

  摘自《微型計算機》

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

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

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