ibeautiful
2022-06-04 09:23:08
盡管我使用相同的代碼,但在我的兩臺設備之一上onPreviewFrame沒有調用。我正在嘗試獲取、處理(使用 OpenCV),然后使用已棄用的相機 API 顯示相機幀。(因為我使用的是LEGACY設備,而棄用的 API 為它提供了更好的性能。)這意味著我不想直接顯示預覽幀,但我能夠確定在此設備上,設置顯示對于進行預覽是必要的。這意味著我必須設置某種高性能虛擬顯示器。我的選擇是:setPreviewDisplay->SurfaceHolder和setPreviewTexture-> SurfaceTexture。我學到的另一件事是,setPreviewCallbackWithBuffer這在這個設備上也不起作用:我必須使用setPreviewCallback.理想情況下,我想檢測是否需要這些額外的步驟才能進行預覽:如果沒有必要,我不想在不需要它們的設備上執行這些操作。我無法找到SurfaceHolder該setPreviewDisplay方法的虛擬對象,因此無法使用該方法調用預覽回調。另一方面,setPreviewTexture使用 newSurfaceTexture確實onPreviewFrame會調用 get,但我不斷收到“BufferQueue has been mapped”錯誤,并且預覽數據似乎也不正確:當我設置圖像格式時,從所述數據創建的圖像不正確. 查看不同的顏色會導致圖像顯示不同的顏色。同樣,相同的代碼在另一臺設備上工作,我設置了圖像格式,因此輸出應該是有效的。我當前的代碼在哪里onPreviewFrame被調用,但數據無效:camera = Camera.open();camera.setPreviewTexture(new SurfaceTexture(1));camera.setPreviewCallback(this);camera.setParameters(configurator.getParameters()); //sets the resolution (same on both devices), the fps range and the format to ImageFormat.YV12 (or NV21, makes no difference)camera.startPreview();不需要預覽顯示的手機:Doogee X5 MAX有問題的手機:三星 Galaxy J3 (2016)
2 回答

哆啦的時光機
TA貢獻1779條經驗 獲得超6個贊
setPreviewCallbackWithBuffer
沒有工作,因為緩沖區太小。直到我擺脫了“BufferQueue 已被放棄”錯誤,我才看到錯誤。緩沖區太小的原因是:
我沒有查詢預覽大小,我只是使用了我設置預覽大小的值
我打電話給
Camera.Parameters#setRecordingHint(true)
,它將我的分辨率(可能還有其他設置)鎖定為硬編碼值。這個分辨率和我選擇的不一樣,所以我的緩沖區確實太小了。

慕標琳琳
TA貢獻1830條經驗 獲得超9個贊
回復:虛擬預覽紋理,這是您可以獲得的最佳解決方法。官方 API 要求必須在某個地方進行預覽,并且大多數設備都會執行此策略。
無法在運行時檢查設備是否在沒有“接收器”(表面或紋理)可供繪制的情況下提供實時預覽。在其他類似情況下,我們被迫根據 QA 實驗室實驗和最終用戶投訴維護設備的白名單和黑名單。對于某些功能,該技術是在您的應用程序(在特定設備上)第一次運行時嘗試最佳設置,如果它崩潰或失敗,則在第二次嘗試時使用效率較低的替代方案,并將此標志保留在未來發布的SharedPreferences。
幸運的是,添加一個虛擬SurfaceTexture不會對性能產生負面影響,即使在沒有它也可以工作的設備上也是如此。
為避免出現“BufferQueue 已被放棄”錯誤,請將虛擬SurfaceTexture作為字段添加到您的活動或片段中。
添加回答
舉報
0/150
提交
取消