Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中利用OpenMax 編程的基本流程

Android中利用OpenMax 編程的基本流程

編輯:關於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 surface;
sp gbp;
if (jSurface) {
surface = android_view_Surface_getSurface(env, jSurface);
if (surface != NULL) {
gbp = surface->getIGraphicBufferProducer();
}
}
最終得到 一個 IGraphicBufferProducer 的 實例 gbp
2: 上層提供一個 sp &bufferProducer 的一個引用並可以用來創建ANativeWindow mNativeWindow = new Surface(bufferProducer) //些處參考AwesomePlayer.cpp

6: 調用5返回來的兩個MediaSource實例的read方法(主要是用於獲取一個MediaBuffer的實例 mVideoBuffer)來獲取解碼後的數據(即在MediaBuffer中)並進行相應處理(即進行播放)

7: 通過ANativeWindow來顯示圖像
status_t err = mNativeWindow->queueBuffer(mNativeWindow.get(), mVideoBuffer->graphicBuffer().get(), -1);
sp metaData = mVideoBuffer->meta_data();
metaData->setInt32(kKeyRendered, 1); //主要設置一個渲染標記,說明已經顯示 (猜得)

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved