日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2025/3/17 Android 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 编程的基本流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。