簡體   English   中英

Android Camera2 + MediaCodec + MediaMuxer 使用持久表面?

[英]Android Camera2 + MediaCodec + MediaMuxer using persistent surface?

我正在編寫一個攝像機應用程序。 當我打開我的捕獲活動時,我想配置一個開始預覽的相機捕獲 session,當用戶稍后按下錄制按鈕時,它應該開始使用 MediaCodec + MediaMuxer 錄制視頻(不是 MediaRecorder 出於應用程序特定的原因)重新創建一個新的 CameraCaptureSession。 我嘗試使用MediaCodec#createPersistentInputSurface來實現這一點。

到目前為止,我已經完成了預覽工作,MediaCodec/MediaMuxer 位正在生成一個“有效的”output 視頻文件(根據 ffprobe),但視頻的內容是隨機對角線顏色的閃爍/加擾。 在另一台設備上,相同的代碼根本無法創建捕獲 session。 我相信問題是我在創建捕獲 session之后創建了 MediaCodec 實例,這意味着當相機配置有持久表面時,它不知道它應該使用什么 output 大小和顏色格式。

我的問題:我需要遵循什么管道才能實現我正在尋找的使用 MediaCodec 和持久輸入表面的行為?

我的筆記:

  • 據我測試/理解,您只能使用一次 MediaCodec 實例。 對於下一個錄音,您必須創建一個新錄音。 因此,要僅使用允許多個視頻錄制的單個攝像頭捕獲 session,則需要在配置捕獲 session創建 MediaCodec 實例。

  • 所有創建的 MediaCodecs 必須使用相同的表面,因為它在相機捕獲 session 中指定( 延遲表面(第二個要點)可以改變這個嗎?),因此為什么它需要持久化。

  • 需要在相機捕獲 session 之前創建持久表面,並且 MediaCodec 需要在相機捕獲 session 開始之前配置持久表面...

有點雞和蛋的問題。 有沒有辦法打破這個循環依賴循環?

通過執行以下操作,我最終獲得了所需的行為(即使它看起來有點 hacky):

  • 創建持久輸入表面
  • 創建一個虛擬 MediaCodec,其配置/參數與您稍后將使用的完全相同,調用MediaCodec::configureMediaCodec::setInputSurface (具有持久輸入表面)。 這將初始化持久表面的內部顏色/格式參數等,這是創建捕獲 session 成功所必需的。
  • 使用持久輸入表面創建所需的捕獲 session
  • 釋放虛擬視頻編碼器,因為我們不再需要它

從那里開始,您可以保留一個相同的相機捕獲 session 並在每次您想要錄制某些內容時創建新的 MediaCodecs,但它們總是需要像虛擬的那樣配置,否則可能會出現錄制問題。

旁注:在這個問題中,我認為延遲表面可能會有所幫助,但我現在完全理解它們,不,它們對解決特定問題沒有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM