編輯:關於Android編程
最近由於公司在做數字電視,播放器和模塊由供應商打包一起賣,驅動調通了,可是播放器要硬件解碼,和平台差異,原廠又沒有相關文檔,就自己試著看了一個系統的播放器流程,順便整理了一下,也方便以後查詢,希望對播放器硬解碼的開發能起到點作用。由於對視頻也不了解,所以難免有不少錯誤,歡迎高手指導。
1: 由文件或者設備來創建一個dataSource(DataSource) (其中可以是文件描述符fd, uri ,http)
2: 通過dataSource來創建一個MediaExtractor(即視頻的分流器paser)實例
3: 由 MediaExtractor實例來創建兩個MediaSource(視頻要包含兩個, 一個為視頻mVideoTrack, 一個為音頻 mAudioTrack), 其中就重要的是read函數用於解碼器獲得原始視頻數 據 進行解碼
4: 創建一個OMXClient實例並連接(具體調用其connect()方法,並檢查是否成功返回)
5: 創建相應的解碼器實例 例如:
mOmxSource = OMXCodec::Create(
mClient.interface(), mAudioTrack->getFormat(),
false, // createEncoder
mAudioTrack);
mVideoSource = OMXCodec::Create(
mClient.interface(), mVideoTrack->getFormat(),
false, // createEncoder
mVideoTrack,
NULL, flags,
mNativeWindow);
mAudioTrack mVideoTrack 即為兩個MediaSource實例 分別代表原始的數據源
注意這兩個都返回了一個MediaSource的實例(mOmxSource and mVideoSource),這兩個是用於用戶獲得解碼後的音視頻數據並進行播放使用的
mNativeWindow(ANativeWindow) 為上層Surface的下層體現,即上層要用於顯示的Surface
創建 ANativeWindow 的方法:
1: 從JAVA層會通過JNI傳遞一個JSurface的對象到JNI, 而JNI可以通過這個對象來獲取IGraphicBufferProducer, 方法為:
sp
sp
if (jSurface) {
surface = android_view_Surface_getSurface(env, jSurface);
if (surface != NULL) {
gbp = surface->getIGraphicBufferProducer();
}
}
最終得到 一個 IGraphicBufferProducer 的 實例 gbp
2: 上層提供一個 sp
6: 調用5返回來的兩個MediaSource實例的read方法(主要是用於獲取一個MediaBuffer的實例 mVideoBuffer)來獲取解碼後的數據(即在MediaBuffer中)並進行相應處理(即進行播放)
7: 通過ANativeWindow來顯示圖像
status_t err = mNativeWindow->queueBuffer(mNativeWindow.get(), mVideoBuffer->graphicBuffer().get(), -1);
sp
metaData->setInt32(kKeyRendered, 1); //主要設置一個渲染標記,說明已經顯示 (猜得)
並不是所有的BAT的API都是非常好用的,微信支付就有不少的缺陷,總結一下微信支付實現中出現的問題 坑點一: PayReq的參數 sign的生成&
剛剛做了一個項目,是做應用牆相關的,就是把一個個應用的圖標和名稱顯示到GridView中。本來想著,像GridView這樣常用成熟的控件,使用應該非常的簡單,但真正在項目
手機QQ同步助手可以備份短信和聯系人到網絡中,你只要下載並安裝QQ同步助手並用QQ號登錄,就可以將你的短信和聯系人備份到網絡中,當你換手機或者格機的時候就可
相信去年聖誕節打開過手機淘寶的童鞋都會對當時的特效記憶猶新吧:全屏飄雪,旁邊還有個小雪人來控制八音盒背景音樂的播放,讓人有種身臨其境的感覺,甚至忍不住想狠狠購物了呢(誤)