[Transferir] Este puede ser el artículo más detallado que presenta Android UvcCamera

El dispositivo está conectado con una cámara USB externa para vista previa básica, toma de fotos y grabación de video. Creo que algunos estudiantes han encontrado necesidades similares en su trabajo.

camara uvc? Independientemente de si lo ha usado antes o lo ha encontrado, creo que después de leer este artículo, definitivamente le traerá algunas ganancias.

Este artículo ampliará los siguientes puntos:

     1. ¿Qué es UVC?
     2. ¿Proyecto de código abierto UVCCamera?
     3. ¿Integración de proyectos de código abierto?
     4. ¿Cambios menores en la demostración, para obtener una transmisión yuv en tiempo real durante la grabación?
     5. ¿Problemas encontrados y soluciones?

1. ¿Qué es UVC?

El nombre completo de UVC es USB Video Class, y la traducción directa significa: USB Video Class, que es un estándar de protocolo especialmente definido para dispositivos de captura de video USB.

Este estándar es un estándar de protocolo definido para dispositivos de captura de video USB lanzado conjuntamente por Microsoft y varios otros fabricantes de dispositivos, y se ha convertido en uno de los estándares de organización USB.

Los principales sistemas operativos actuales han proporcionado controladores de dispositivos UVC, por lo que los dispositivos de hardware que cumplen con la especificación UVC se pueden usar normalmente en el host sin instalar ningún controlador. Sí, el sistema Android actual ya es compatible con dispositivos uvc.

resumen:

Hablando de esto, todos deberían tener ese concepto, uvc es un protocolo y diferentes dispositivos pueden admitir diferentes protocolos. Si nuestra cámara usb necesita ser compatible con dispositivos Android, entonces esta cámara debe ser una cámara compatible con el protocolo uvc.

2. ¿Proyecto de código abierto UVCCamera?

https://github.com/saki4510t/UVCCamera

Ahora buscamos artículos relacionados con la cámara uvc en Internet, y los proyectos relacionados con la cámara uvc que podemos encontrar se pueden decir sin exagerar, básicamente basados ​​en el proyecto de código abierto anterior. El paquete es muy bueno, la lógica del código es relativamente clara. , y es muy conveniente de usar, y se han realizado las funciones básicas de vista previa, foto y video de la cámara.Es un proyecto relativamente completo.

Primero extraemos el código localmente a través de git pull y lo importamos a AndroidStudio (también es posible descargar el código directamente sin git pull.

Si el sitio web de github no supera el muro en China, a veces puede no ser accesible, por qué no, también puede intentar buscar este proyecto en gitee para descargar).

9f8733dc0ffb1480198b3a47b6c1fc92.png

La estructura de directorios de todo el proyecto se muestra en la siguiente figura. Por supuesto, durante el proceso de importación, encontrará algunos problemas de informe de errores, de hecho, es principalmente un problema con la versión gradle.

Para el problema de los errores de importación, le daremos una explicación detallada más adelante en este artículo, incluidos los problemas encontrados y cómo solucionarlos.

083e0638c6af4af0d5433b126f87789d.png

En este proyecto de código abierto, además del código fuente de la biblioteca sdk, el autor también proporciona 8 demostraciones. Las funciones específicas de estas 8 demostraciones se presentan a continuación:

1)USBCameraTest0
            显示如何使用SurfaceView来启动/停止预览。
 
 
2)USBCameraTest
            显示如何启动/停止预览。这与USBCameraTest0几乎相同,
            但是使用自定义的TextureView来显示相机图像而不是使用SurfaceView。
 
 
3)USBCameraTest2
            演示如何使用MediaCodec编码器将UVC相机(无音频)的视频记录为.MP4文件。
            此示例需要API>=18,因为MediaMuxer仅支持API>=18。
 
 
4)USBCameraTest3
            演示如何将音频(来自内部麦克风)的视频(来自UVC相机)录制为.MP4文件。
            这也显示了几种捕捉静止图像的方式。此示例可能最适用于您的定制应用程序的基础项目。
 
 
5)USBCameraTest4
            显示了访问UVC相机并将视频图像保存到后台服务的方式。
            这是最复杂的示例之一,因为这需要使用AIDL的IPC。
 
 
6)USBCameraTest5
            和USBCameraTest3几乎相同,但使用IFrameCallback接口保存视频图像,
            而不是使用来自MediaCodec编码器的输入Surface。
            在大多数情况下,您不应使用IFrameCallback来保存图像,因为IFrameCallback比使用Surface要慢很多。
            但是,如果您想获取视频帧数据并自行处理它们或将它们作为字节缓冲区传递给其他外部库,
            则IFrameCallback将非常有用。
 
 
7)USBCameraTest6
            这显示了如何将视频图像分割为多个Surface。你可以在这个应用程序中看到视频图像并排观看。
            这个例子还展示了如何使用EGL来渲染图像。
            如果您想在添加视觉效果/滤镜效果后显示视频图像,则此示例可能会对您有所帮助。
 
 
8)USBCameraTest7
            这显示了如何使用两个摄像头并显示来自每个摄像头的视频图像。这仍然是实验性的,可能有一些问题。
 
 
9)usbCameraTest8
            这显示了如何设置/获取uvc控件。目前这只支持亮度和对比度。

La lógica del código de la demostración proporcionada es muy clara y puede ver la demostración correspondiente según sus necesidades.

Estas demostraciones incluyen funciones básicas como vista previa, grabación y toma de fotografías. En cuanto a ajustar el brillo y el contraste, puede deberse a diferentes cámaras. Lo verifiqué localmente y en realidad no funcionó. Si algún estudiante lo prueba más tarde y funciona, déjeme un mensaje e intercambiemos ideas.

Podemos ver que Demo7 es una Demo que soporta 2 cámaras. Si hay varios requisitos de soporte de cámara, puede consultar la lógica en esto.

3. Compilación e integración del proyecto de código abierto UVCCaemra?

El código central de UVCCamera está en libuvcamera.

2a423b89062504a05e0df315754e9057.png

Si queremos integrar este proyecto en nuestro proyecto, necesitamos dos cosas, una es la biblioteca so y la otra es el código fuente java sdk que se puede llamar.

En la captura de pantalla anterior, podemos ver claramente que el código contiene principalmente dos partes de jni y java. Compile jni para obtener la biblioteca so que necesitamos. El código java se puede empaquetar en aar, o el código completo se puede copiar directamente a nuestro directorio de proyectos, que también se puede usar como referencia de biblioteca.

1) Compilación de la biblioteca

Ahora la compilación de la biblioteca so es muy conveniente. Como se muestra en la figura a continuación, cambiamos al directorio jni en la interfaz de terminal de terminal de as, y directamente ndk-build para generar el archivo de biblioteca so que necesitamos.

7f0610f7064d54756def22f6a500bed4.png

Aquí hay un lugar al que debemos prestar atención, es decir, necesitamos archivos de biblioteca de Android de 32 o 64 bits, que están configurados en Application.mk. He marcado con un círculo la ubicación del archivo Application.mk en la captura de pantalla anterior . Si es de 32 bits, el contenido de APP_ABI aquí se puede cambiar a armeabi-v7a, 64 bits es arm64-v8a, y así sucesivamente para otras plataformas.

2) Pack aar

Si nuestro proyecto quiere integrar este proyecto de código abierto, debemos proporcionar el código Java antes de poder llamarlo. La forma en que uso aquí es empaquetar el código central de UVCCamera (es decir, sin incluir 8 demostraciones) en aar, y luego referirme al aar empaquetado en mi propio directorio de proyectos. El empaquetado en aar también se opera en AS de manera muy simple
. Publica la foto primero.

197b71ee6220eccc8fe5a6b88c21077d.png

8a2be6120b1d6b9ad1ab15b5ff71c88c.png

En la captura de pantalla anterior, podemos ver que hay 2 módulos que deben empaquetarse, libuvccamera y usbCameraCommon.

Siga la secuencia de operaciones en la captura de pantalla, del 1 al 3. Primero, haga clic en Gradle en el lado derecho de la interfaz as. En la interfaz desocupada, haga doble clic para ejecutar ensamblarRelease. Si no hay ningún error después de la ejecución, puede ver el archivo aar generado en la ruta de salida de compilación del módulo.

El último es copiar el archivo de biblioteca so generado y el archivo aar generado en el directorio libs de nuestro propio proyecto e importarlo al proyecto para su uso.

3) Integrar UVCCamera sdk en nuestro propio proyecto
A través de los pasos anteriores, hemos compilado con éxito el archivo de biblioteca so y el archivo aar. La siguiente figura muestra que importamos los archivos generados en nuestros propios proyectos de ingeniería.

7d22a4489eb17e83a6291d90ba018d8b.png

4. Cambios menores en la demostración: mientras graba video, ¿obtiene una transmisión yuv en tiempo real?

He escrito un artículo sobre uvcCamea antes, y la dirección está publicada aquí, junto con la dirección de la demostración. Los estudiantes interesados ​​también pueden echar un vistazo.

En esta demostración, además de las funciones básicas de vista previa, foto y video, también agregué una interfaz para devolver la transmisión yuv en tiempo real de acuerdo con mis propias necesidades. Si es necesario realizar transmisiones de video en tiempo real, como reconocimiento facial y carga en segundo plano, creo que puede ayudarlo.

"Un artículo lo lleva a comprender la cámara USB de Android"
https://www.jianshu.com/p/35124f098c24

dirección de demostración:
https://github.com/yorkZJC/UvcCameraDemo

Con respecto a mi propia demostración, si necesita modificar la resolución, puede modificarla en el archivo MyConstants.java como se muestra en la figura a continuación.

cfef4a608beec9e71bf660db69fe8107.png

La siguiente captura de pantalla muestra la interfaz de la devolución de llamada del flujo yuv .

915d55c8f27de4304a38a90f8b8563a1.png

5. ¿Problemas encontrados y soluciones?

1) ¿Configuración SDK, NDK?

En el primer paso, primero debemos configurar el sdk y el nkd. Creo que muchos estudiantes podrán configurar el sdk. Además, necesitamos usar ndk-build para compilar la biblioteca so, por lo que el ndk debe configurarse correctamente. Creo que mi versión local de ndk es r17 La versión de este ndk tiene poco impacto.

Hay dos formas de configurar ndk: puede modificarlo directamente en el archivo local.properties o puede configurarlo seleccionando nuestra ruta local de nkd en la interfaz de visualización y la estructura del proyecto.

Las siguientes capturas de pantalla corresponden a estos dos métodos de modificación diferentes, y puede usar cualquiera de ellos.

d272bba55615933ac0fda9d67aa4055.png

0526c422eaea4e8f4d369698189b7dfa.png

2) ¿Importar Android Studio, configuración de la versión Gradle?

Los siguientes son algunos problemas que he encontrado. De acuerdo con mi operación de modificación, creo que todos pueden ejecutarla con éxito.
【error 1】

Caused by: org.apache.http.conn.HttpHostConnectException: Connect to maven.google.com:443 
[maven.google.com/142.250.204.46] failed: Connection timed out: connect

1f84b3cd572283b128cde8805d7e5866.png

【error2】

ERROR: The minSdk version should not be declared in the android manifest file. You can move the version from the manifest to the defaultConfig in the build.gradle file.
Remove minSdkVersion and sync project
Affected Modules: libuvccamera

728df0c789e1c4e4ef878c5d4dabca71.png

【error3】

* What went wrong:
Execution failed for task ':libuvccamera:ndkBuild'.
> A problem occurred starting process 'command 'null/ndk-build.cmd''

73c3ad95ee512ba025dfd3d0b3d84d80.png

Android NDK: The armeabi ABI is no longer supported. Use armeabi-v7a.    
Android NDK: NDK Application 'local' targets unknown ABI(s): armeabi mips    
D:/APPS/sdk/android-ndk-r17b/build//../build/core/setup-app.mk:79: *** Android NDK: Aborting    .  Stop.
2021-06-11 10:08:11.386 3105-3105/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.serenegiant.usbcameratest0, PID: 3105
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.serenegiant.usbcameratest0/com.serenegiant.usbcameratest0.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3432)

Saco el código localmente a través de git pull, por lo que cada modificación local se puede rastrear y registrar a través de git. En cuanto al error de compilación, echemos un vistazo a lo que he modificado en total.

5880535de8b6392d4978888f21f9e7a6.png

En la captura de pantalla anterior, podemos ver que se han modificado un total de 5 lugares.
   i.Modificación de build.gradle en el directorio raíz del proyecto
  ii.Modificación de libuvcamera/build.gradle;

3) Cuando se extrae la cámara USB, ¿la aplicación se cierra debido a una excepción de bloqueo?

Hay un error en el archivo de la biblioteca original, es decir, cuando desconectamos la cámara mientras usamos la cámara USB, hay un bloqueo en la biblioteca, lo que hace que nuestra aplicación se cierre de manera anormal directamente.

Para este problema, otros grandes dioses en Internet han dado soluciones, y publicaré los lugares modificados aquí. También modifiqué personalmente la verificación.

ffbb13349b12667211a77697473ae8b7.png

diff --git a/libuvccamera/src/main/jni/libusb/libusb/os/android_usbfs.c b/libuvccamera/src/main/jni/libusb/libusb/os/android_usbfs.c
index 8626595..c4842c4 100644
--- a/libuvccamera/src/main/jni/libusb/libusb/os/android_usbfs.c
+++ b/libuvccamera/src/main/jni/libusb/libusb/os/android_usbfs.c
@@ -2726,6 +2726,12 @@ static int handle_iso_completion(struct libusb_device_handle *handle,    // XXX add
 
        usbi_mutex_lock(&itransfer->lock);
        for (i = 0; i < num_urbs; i++) {
+           //+Add by york.zhou on 2021.05.19,fix issue app crash on remove usb device
+           if (tpriv->iso_urbs == NULL){
+            break;
+        }
+        //-Add by york.zhou on 2021.05.19,fix issue app crash on remove usb device
+
                if (urb == tpriv->iso_urbs[i]) {
                        urb_idx = i + 1;
                        break;
diff --git a/libuvccamera/src/main/jni/libuvc/src/stream.c b/libuvccamera/src/main/jni/libuvc/src/stream.c
index 8a1e90a..b7cedcc 100644
--- a/libuvccamera/src/main/jni/libuvc/src/stream.c
+++ b/libuvccamera/src/main/jni/libuvc/src/stream.c
@@ -641,7 +641,8 @@ static void _uvc_delete_transfer(struct libusb_transfer *transfer) {
                                libusb_cancel_transfer(strmh->transfers[i]);    // XXX 20141112追加
                                UVC_DEBUG("Freeing transfer %d (%p)", i, transfer);
                                free(transfer->buffer);
-                               libusb_free_transfer(transfer);
+                               //+Add york.zhou 2021.05-19,fix remove usb devices,app crash
+                               //libusb_free_transfer(transfer);
                                strmh->transfers[i] = NULL;
                                break;
                        }
 
4) ¿Algunas cámaras USB no se pueden reconocer?

Algunos estudiantes también pueden encontrar el problema de que algunas cámaras USB no se pueden reconocer. Aquí hay una premisa, que es confirmar que la cámara usb se puede reconocer y usar normalmente cuando está enchufada a la computadora, pero no se puede reconocer cuando está enchufada a nuestro dispositivo.

Cuando encuentre este tipo de problema, puede obtener un registro de logcat completo, luego buscar una subclase globalmente en el registro y configurar la información relacionada con la subclase que se encuentra en el formato de la captura de pantalla a continuación en device_filter.xml en el directorio xml.

fd91c005c83537d03053978f75e555e8.png

Sobre el contenido de uvcCamera, está aquí.

Gracias a todos por leer. También son bienvenidos a comunicarse juntos.

Supongo que te gusta

Origin blog.csdn.net/qq_27489007/article/details/131326292
Recomendado
Clasificación