簡體   English   中英

某些設備上未調用相機 onPreviewFrame()(不存在預覽顯示)

[英]Camera onPreviewFrame() is not called on some devices (no preview display present)

在我的兩台設備之一上,盡管我使用了相同的代碼,但沒有調用onPreviewFrame

我正在嘗試獲取、處理(使用 OpenCV),然后使用已棄用的相機 API 顯示相機幀。 (因為我使用的是LEGACY設備,而棄用的 API 為其提供了更好的性能。)

這意味着我不想直接顯示預覽幀,但我能夠確定在此設備上,需要設置顯示才能進行預覽。 這意味着我必須設置某種高性能的虛擬顯示器。 我的選項是: setPreviewDisplay -> SurfaceHoldersetPreviewTexture -> SurfaceTexture

我學到的另一件事是setPreviewCallbackWithBuffer在這個設備上也不起作用:我必須使用setPreviewCallback

理想情況下,我想檢測我是否需要這些額外的步驟才能使預覽工作:如果沒有必要,我不想在不需要它們的設備上執行這些操作。

我無法為setPreviewDisplay方法找到一個虛擬SurfaceHolder ,因此我無法使用它來調用預覽回調。 在另一方面, setPreviewTexture一個新的SurfaceTexture確實讓onPreviewFrame被調用,但我經常收到“BufferQueue已被放棄”的錯誤和預覽數據似乎不正確,以及:當我設置的圖像格式,從所述創建的圖像數據不正確。 查看不同的顏色會導致圖像顯示不同的顏色。 同樣,相同的代碼在另一台設備上工作,我設置了圖像格式,因此輸出應該是有效的。

我當前的代碼,其中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
出現問題的手機:Samsung Galaxy J3 (2016)

回復:虛擬預覽紋理,這是您可以獲得的最佳解決方法。 官方 API 要求預覽必須放在某個地方,並且大多數設備都執行此策略。

無法在運行時檢查設備是否提供實時預覽而沒有“接收器”(表面或紋理)可供繪制。 在其他類似情況下,我們被迫根據 QA 實驗室實驗和最終用戶投訴維護設備的白名單和黑名單。 對於某些功能,該技術是在您的應用程序第一次運行時(在特定設備上)嘗試最佳設置,如果它崩潰或失敗,則在第二次嘗試時使用效率較低的替代方案,並保留此標志SharedPreferences用於未來發布。

幸運的是,即使在沒有它的情況下也可以工作的設備上,添加一個虛擬SurfaceTexture不會對性能產生負面影響。

為避免“BufferQueue has been changed”錯誤,請在您的活動或片段中添加虛擬SurfaceTexture作為字段。

setPreviewCallbackWithBuffer不起作用,因為緩沖區太小。 直到我擺脫了“BufferQueue has been denied”錯誤,我才看到錯誤。 緩沖區太小的原因是:

  • 我沒有查詢預覽大小,我只是使用了我設置預覽大小的值

  • 我調用了Camera.Parameters#setRecordingHint(true) ,它將我的分辨率(可能還有其他設置)鎖定為硬編碼值。 這個分辨率和我選擇的不一樣,所以我的緩沖區確實太小了。

暫無
暫無

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

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