久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

如何使用 JNI 在 C 中獲取原始 Android 相機緩沖區(qū)

How do I get the raw Android camera buffer in C using JNI?(如何使用 JNI 在 C 中獲取原始 Android 相機緩沖區(qū)?)
本文介紹了如何使用 JNI 在 C 中獲取原始 Android 相機緩沖區(qū)?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我一直在徹底搜索 Google 和 StackOverflow,但找不到這個.也許我錯過了一些明顯的東西.謝謝!

I've been searching Google and StackOverflow exhaustively and cannot find this. Maybe I'm missing something obvious. Thanks!

(這是因為預覽回調的Java實現(xiàn)[即使有緩沖區(qū)]效率太低.)

(This is because the Java implementation of the preview callback [even with buffer] is too inefficient.)

推薦答案

我對主題做了一點調查.這個介紹(來自p.277,中文)幫助很大.

I made a little investigation on topic. This presentation (from p.277, Chinese) helped a lot.

正如其他人提到的,您可以使用 Camera.setPreviewCallback 方法獲取緩沖區(qū).
以下是它的發(fā)生方式(詳細版本):

As others mentioned, you can get a buffer using a Camera.setPreviewCallback method.
Here's how it happens there (a verbose version):

  1. 用戶調用 Camera.startPreview() 這是一個原生函數(shù).
  2. android_hardware_Camera_startPreview 調用C++ Camera 類的startPreview 方法.
  3. Camera調用ICamera接口的startPreview方法
  4. ICamera 對遠程客戶端進行 IPC 調用.
  5. 調用CameraService類的setCameraMode方法.
  6. CameraService 設置一個窗口顯示預覽并調用CameraHardwareInterface 類的startPreview 方法.
  7. 后者嘗試在特定 camera_device_t 設備上調用 start_preview 方法.
    我沒有進一步查找,但它應該會調用驅動程序.
  8. 當圖片到達時,調用CameraServicedataCallback.
  9. 將數(shù)據(jù)傳遞給客戶端的handlePreviewData方法.
  10. 客戶端要么復制緩沖區(qū),要么直接將其發(fā)送到 ICameraClient.
  11. ICameraClient 通過IPC 將其發(fā)送到Camera.
  12. Camera 調用已注冊的監(jiān)聽器并將緩沖區(qū)傳遞給 JNI.
  13. 它調用 Java 類中的回調.如果用戶使用 Camera.addCallbackBuffer 提供了一個緩沖區(qū),則它首先復制到緩沖區(qū).
  14. 最后,Java 類 Camera 處理消息并調用 Camera.PreviewCallbackonPreviewFrame 方法.
  1. User calls Camera.startPreview() which is a native function.
  2. android_hardware_Camera_startPreview calls startPreview method of C++ Camera class.
  3. Camera calls a startPreview method of ICamera interface
  4. ICamera makes an IPC call to remote client.
  5. It calls a setCameraMode method of CameraService class.
  6. CameraService sets a window to display a preview and calls a startPreview method of CameraHardwareInterface class.
  7. The latter tries to call a start_preview method on particular camera_device_t device.
    I didn't looked up further but it should perform a call to the driver.
  8. When image arrives, dataCallback of CameraService is invoked.
  9. It passes data to handlePreviewData method of client.
  10. Client either copies the buffer or sends it directly to the ICameraClient.
  11. ICameraClient sends it over IPC to the Camera.
  12. Camera calls a registered listener and passes buffer to JNI.
  13. It invokes a callback in Java class. If user provided a buffer with Camera.addCallbackBuffer then it copies to the buffer first.
  14. Finally Java class Camera handles the message and invokes a onPreviewFrame method of Camera.PreviewCallback.

如您所見,調用了 2 個 IPC 調用,并且在步驟 10、11 中至少復制了兩次緩沖區(qū).camera_device_t 返回的原始緩沖區(qū)的第一個實例是托管在另一個進程中,由于 CameraService 中的安全檢查,您無法訪問它.

As you can see 2 IPC calls were invoked and buffer was copied at least twice on steps 10, 11. First instance of raw buffer which is returned by camera_device_t is hosted in another process and you cannot access it due to security checks in CameraService.

但是,當您使用 Camera.setPreviewTextureCamera.setPreviewDisplay 設置預覽表面時,它會直接傳遞給相機設備并實時刷新,而無需上面的所有鏈條.正如它的文檔所說:

However, when you set a preview surface using either Camera.setPreviewTexture or Camera.setPreviewDisplay it is be passed directly to the camera device and refreshed in realtime without participation of all the chain above. As it's documentation says:

處理一個由屏幕合成器管理的原始緩沖區(qū).

Handle onto a raw buffer that is being managed by the screen compositor.

Java 類 Surface 有一個方法來檢索它的內容:

Java class Surface has a method to retrieve it's contents:

public static native Bitmap screenshot(int width, int height, int minLayer, int maxLayer);

但是這個 API 是隱藏的.參見 這個問題 了解使用方法.

But this API is hidden. See i.e. this question for a way to use it.

這篇關于如何使用 JNI 在 C 中獲取原始 Android 相機緩沖區(qū)?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯(lián)網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯(lián)系我們刪除處理,感謝您的支持!

相關文檔推薦

Why does the android emulator camera stop unexpectedly?(為什么android模擬器相機會意外停止?)
Android camera , onPictureTaken(byte[] imgData, Camera camera) method amp; PictureCallback never called(Android camera , onPictureTaken(byte[] imgData, Camera camera) 方法 amp;PictureCallback 從未調用過) - IT屋-程序員軟件開發(fā)技
Understanding the libGDX Projection Matrix(了解 libGDX 投影矩陣)
QR code reading with camera - Android(使用相機讀取二維碼 - Android)
IP camera with OpenCv in Java(Java中帶有OpenCv的IP攝像頭)
Android mock Camera(Android 模擬相機)
主站蜘蛛池模板: 激情欧美一区二区三区中文字幕 | 日本久久精 | 色播视频在线观看 | 成人在线电影在线观看 | 久久99精品久久久久久国产越南 | 国产一区二区三区高清 | 欧美激情一区二区三区 | 亚洲中字在线 | 欧美5区| 日本在线视频一区二区 | 国产成人99久久亚洲综合精品 | 久久精品国产清自在天天线 | 中文字幕一区二区三区四区五区 | 久久免费观看视频 | 亚洲黄色av| 不卡一区 | 午夜电影福利 | 日韩在线中文字幕 | 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 亚洲精品一区二三区不卡 | 男女羞羞视频在线观看 | 99色视频| 欧美一区二区三区四区在线 | 亚洲综合一区二区三区 | 青草福利 | 日本激情视频中文字幕 | 中文字幕在线视频免费观看 | 日韩在线 | www.黄色片视频 | 亚洲精品2 | 日本欧美国产在线 | 久久久国产一区 | 欧美一区二区三区小说 | 国产亚洲精品成人av久久ww | 天天爽天天操 | 亚洲精品第一 | 日韩欧美精品 | 成人在线视频观看 | 99热首页| 久久精品欧美一区二区三区不卡 | 国产精品毛片一区二区三区 |