当前位置: 首页>Php>正文

視頻渲染用什么顯卡,Android視頻解碼及渲染

視頻渲染用什么顯卡,Android視頻解碼及渲染

今天給大家說說在android上如何做視頻解碼及渲染。 視頻解碼有多種方法,今天給大家介紹的是用android自帶的MediaCodec進行硬解碼,所謂硬解碼就是利用硬件進行解碼,速度快,與之相對就是軟解碼,速度慢,但兼容性好。 MediaCodec視頻解碼是基于生產者/消費者模式,里面會有一些buffer,需要解碼一幀時從里面拿出一個buffer,給buffer填充好數據,然后再送進去解碼,然后再拿出來解碼好的buffer,用完之后再還回去,如下圖所示:

下面我們來看看如何一步步實現視頻硬解碼及渲染:

1. 創建一塊surface

這個surface的作用是讓MediaCodec解碼到上面,如果你是用SurfaceView,那么它自帶了一個surface,直接解碼到上面就會自動顯示出來,本文中因為還涉及到渲染,所以我是解碼到一個自己創建的surface上,這個surface又是通過surface texture創建的,而surface texture又是通過一個oes texture創建的,所以最終會解碼到一個紋理上,接下來就可以用OpenGL進行渲染處理。

2. 初始化MediaExtractor及MediaCodec

MediaExtractor的作用是從視頻文件中提取數據,前面說的給buffer填充的數據就來源于此,初始化工作主要是給它設置視頻文件路徑,以及選擇軌道,本文講解的是視頻解碼,因為只關心視頻軌道,聲音就不管了。

mediaExtractor = MediaExtractor()
mediaExtractor.setDataSource(filePath)
val trackCount = mediaExtractor.getTrackCount()
for (i in 0 until trackCount) {val trackFormat = mediaExtractor.getTrackFormat(i)val mime = trackFormat.getString(MediaFormat.KEY_MIME)if (mime.contains("video")) {videoTrackIndex = ibreak}
}
if (videoTrackIndex == -1) {mediaExtractor.release()return
}
mediaExtractor.selectTrack(videoTrackIndex)

視頻渲染用什么顯卡。然后是初始化MediaCodec,可以看到我們會向它傳遞一個surface,初始化好之后,就讓它開始工作:

mediaCodec = MediaCodec.createDecoderByType(videoMime)
mediaCodec.configure(videoFormat, surface, null, 0)
mediaCodec.start()

3. 讀取數據并解碼

這一步稍微復雜些,前面提到MediaCodec視頻解碼是基于生產者/消費者模式,我們首先通過dequeueInputBuffer向它去要一個buffer用于承載要解碼的數據,可以指定超時時間,因為里面不一定有空閑buffer了:

val inputBufferIndex = mediaCodec.dequeueInputBuffer(10000)
if (inputBufferIndex >= 0) {val buffer = mediaCodec.getInputBuffers()[inputBufferIndex]
}

然后從視頻文件中讀取數據,如果讀取到的數據長度小于0,說明已經讀完了,此時給buffer置一個標記BUFFER_FLAG_END_OF_STREAM,否則就是讀到了數據填充到了剛剛拿到的buffer,此時再將這個buffer通過queueInputBuffer送回MediaCodec,并讓MediaExtractor的讀取位置往前走:

val sampleSize = mediaExtractor.readSampleData(buffer, 0)
if (sampleSize < 0) {mediaCodec.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM)eos = true
} else {mediaCodec.queueInputBuffer(inputBufferIndex, 0, sampleSize, mediaExtractor.sampleTime, 0)mediaExtractor.advance()
}

接下來就是用dequeueOutputBuffer獲取解碼的結果,同樣也可以設置超時間,如果獲取到的bufferBUFFER_FLAG_END_OF_STREAM標記,那說明解碼全部完成了:

val outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 10000)
if ((bufferInfo.flags and MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {return false
}

對于從dequeueOutputBuffer獲取到的結果,有一些是未解碼好的情況,對于解碼好了的情況,就通過releaseOutputBufferbuffer歸還回去:

when (outputBufferIndex) {MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED, MediaCodec.INFO_OUTPUT_FORMAT_CHANGED, MediaCodec.INFO_TRY_AGAIN_LATER -> {}else -> {mediaCodec.releaseOutputBuffer(outputBufferIndex, true)return true}
}

releaseOutputBuffer第二個參數如果傳true,就表示會渲染到surface上,此時用于構造這個surfacesurface texture就會收到onFrameAvailable()回調,這樣我們就知道一幀解碼好了,這時調用surface textureupdateTexImage()方法將解碼數據更新到texture上,有了這個texture,就可以用OpenGL做渲染了,渲染方法和之前的OpenGL教程里是一樣的,使用完了記得將MediaCodec停止及釋放相關資源。

最后

android opencv,如果你看到了這里,覺得文章寫得不錯就給個贊唄!歡迎大家評論討論!如果你覺得那里值得改進的,請給我留言。一定會認真查詢,修正不足,定期免費分享技術干貨。謝謝!

https://www.nshth.com/php/338444.html
>

相关文章:

  • 視頻渲染用什么顯卡
  • Android opencv
  • android視頻編輯sdk
  • 視頻剪輯渲染最快的CPU
  • android視頻播放器代碼
  • 完美解碼視頻渲染器用哪個
  • maya渲染視頻
  • android源碼編譯
  • 語言使用排行榜,PHP2020語言排行榜,TIOBE公布了2020年12月編程語言排行榜
  • 你好,爬取《你好,李煥英》影評,并生成詞云圖
  • php手冊中文版,PHP筆記 17 18 19 20 21
  • ubuntu怎么切換中文輸入法,ubuntu系統配置中文輸入法以及安裝ros2,docker等開發環境
  • qt設置控件在布局的位置,Qt自定義控件(IP輸入框,windows下)
  • 計算機初級考試內容自測題,計算機基礎知識考題及答案,計算機基礎知識試題及答案(一)
  • 商標查詢,龍門標局:R商標是指什么?購買的商標能標注R嗎?
  • 蘇州注冊公司流程和步驟,蘇州企業拿到商標注冊證后,需要注意哪些事項?
  • 注冊一個商標要多久可以批下來,2022年商標注冊需要多長時間?
  • testflight教程,【技術分享】TestFlight測試的流程文檔
  • ios開發者測試版,iOS APP真機測試及上架App Store流程記錄
  • iphone怎么安裝證書,Windows申請iOS證書上架App Store詳細教程 (有這一篇就夠了)
  • 銀河證券章俊,章俊
  • 央行定向降準是什么意思,央行工作會議說了什么:定向調控 松緊適度
  • 機械制造及其自動化畢業設計,計算機在機械設制造中的應用實例,機械設計與制造畢業設計一體化分析
  • 問句和疑問句的區別,問句識別:基于Xgboost的中文疑問句判斷模型
  • 多線程sleep和wait的區別,非wait線程即時喚醒epoll_wait
  • 服務器終端,服務器TIME_WAIT和CLOSE_WAIT區別及解決方案
  • linux查看最大連接數,linux表示文件連接數,linux中連接數過多(TIME_WAIT/CLOSE_WAIT)讀這一篇就夠了
  • 視頻渲染用什么顯卡,Android視頻解碼及渲染
  • 百家號視頻怎么算原創,百家號基于AE的視頻渲染技術探索
  • 視頻制作,常見幾種視頻渲染模式介紹
  • 電子商務運營技能大賽,2022年ITMC暢享杯全國職業院校電子商務技能大賽SEM直通車競賽平臺介紹思路打法
  • Android基礎入門教程,花2萬塊買的教程!Android技術功底不夠如何去面試,大廠直通車!
  • 拼多多直通車出價技巧,直通車拼多多7天均價比價
  • flutter開發小程序,寫給程序員的Flutter詳細教程,大廠直通車!
  • 聚合支付是什么東西,聚合支付行業術語,你get到了嗎?
  • 支付行業發展現狀及趨勢,支付行業的一些名詞
  • 調和級數時間復雜度,51nod 1421 最大MOD值(高妙的調和級數復雜度)
  • mysql數據庫臟讀解決方案,數據庫事務臟讀、幻讀、不可重復讀的解決方法