Android中利用OpenMax 编程的基本流程
近期因為公司在做數字電視,播放器和模塊由供應商打包一起賣,驅動調通了,但是播放器要硬件解碼,和平臺差異,原廠又沒有相關文檔,就自己試著看了一個系統的播放器流程,順便整理了一下,也方便以后查詢,希望對播放器硬解碼的開發能起到點作用。因為對視頻也不了解,所以難免有不少錯誤,歡迎高手指導。
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> surface;???
???sp<IGraphicBufferProducer> gbp;
???if (jSurface) {????????
????surface = android_view_Surface_getSurface(env, jSurface);
????if (surface != NULL) {
?????gbp = surface->getIGraphicBufferProducer();
????}??????????????????
???}??????????????????????
??終于得到 一個 IGraphicBufferProducer 的 實例 gbp
?2: 上層提供一個 sp<IGraphicBufferProducer> &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> metaData = mVideoBuffer->meta_data();
??? metaData->setInt32(kKeyRendered, 1);???//主要設置一個渲染標記,說明已經顯示 (猜得)
?
總結
以上是生活随笔為你收集整理的Android中利用OpenMax 编程的基本流程的全部內容,希望文章能夠幫你解決所遇到的問題。