![](/img/trans.png)
[英]MediaCodec's Persistent Input Surface unsupported by Camera2 Session?
[英]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::configure
和MediaCodec::setInputSurface
(具有持久輸入表面)。 這將初始化持久表面的內部顏色/格式參數等,這是創建捕獲 session 成功所必需的。從那里開始,您可以保留一個相同的相機捕獲 session 並在每次您想要錄制某些內容時創建新的 MediaCodecs,但它們總是需要像虛擬的那樣配置,否則可能會出現錄制問題。
旁注:在這個問題中,我認為延遲表面可能會有所幫助,但我現在完全理解它們,不,它們對解決特定問題沒有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.