[英]Android Camera2 capture image skewed
更新 :這看起來與此相關: 來自Android camera2 API的圖像數據在Galaxy S5上翻轉和壓扁 - 我認為這是一個錯誤,因為Nexus 5/6正常工作,因此無需獲得完整的傳感器大小就沒有意義手動裁剪以達到所需的寬高比,也可能不使用“支持”的輸出尺寸!
問題:
編解碼器輸出具有正確的大小。 但結果因設備而異:
沒問題,有人會說。 也許表面不是精確地在指定的寬度和高度創建的,或者其他任何東西(即使輸出大小是專門為MediaCodec.class目標提取的)。
因此,我創建了一個OpenGL上下文,為它生成了一個紋理,一個SurfaceTexture,將其默認緩沖區大小設置為相機輸出大小,並使用紋理創建了一個Surface。 我不會詳細介紹將其繪制到TextureView或返回到MediaCodec的EGL表面。 結果是相同的 - Camera2捕獲請求僅為某些分辨率輸出失真圖像。 深入挖掘:在updateTexImage之后立即在SurfaceTexture上調用getTransformMatrix - 矩陣始終是標識矩陣,如預期的那樣。
因此,這里真正的問題是相機沒有捕獲所提供的目標表面的大小。 因此,解決方案是獲得相機捕獲的實際尺寸,其余的是純GL矩陣變換以正確繪制。 但是 - 我怎么辦?
注意:使用舊的Camera API,具有與目標完全相同的“預覽大小”和相同的表面(MediaCodec或自定義的) - 一切都很精細! 但是我不能使用舊的相機API,因為它已被棄用,並且似乎最大捕獲大小為1080p,而Camera2 API超出了這個范圍,我需要支持4k錄制。
我遇到了類似的問題,模型SM-A7009
與api 21級,傳統camera2設備。
預覽被拉伸, surfaceTexture.setDefaultBufferSize
不起作用,框架將在預覽開始時覆蓋這些值。
從StreamConfigurationMap.getOutputSizes(SurfaceTexture.class)
報告的預覽大小並非全部受支持。
只支持其中三個。
$ adb shell dumpsys media.camera |grep preview-size
preferred-preview-size-for-video: 1920x1080
preview-size: 1440x1080
preview-size-values: 1920x1080,1440x1080,1280x720,1056x864,960x720,880x720,800x480,720x480,640x480,528x432,352x288,320x240,176x144
該系統轉儲信息列表許多預覽尺寸,檢查所有的人后,我發現只有1440x1080
, 640x480
, 320x240
的支持。
支持的預覽尺寸均為1.33333
比率。 它們與CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE
報告的比率相同。
所以我認為這是一些在API 21中使用傳統camera2 api的三星設備中的錯誤。
解決方案是使用不推薦的相機API制作這些設備。
希望任何人到達這里都會有所幫助。
所以是的,這是三星設備上的一個錯誤。
通常,當您在輸出上要求多個不同的寬高比時,會發生這種情況,並且特定於設備的攝像機代碼會在裁剪時自行跳過並正確縮放所有這些。 您可以通過確保所有請求的大小具有相同的寬高比來避免它。
分辨率可能實際上是你要求的 - 但是它被錯誤地縮放(你可以用有問題的大小的ImageReader來測試它,你可以在那里找到一個明確的緩沖區。)
我們正在為Android合規性測試添加額外的測試,以確保這些延伸的輸出不會繼續發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.