[Übertragen] Dies ist möglicherweise der ausführlichste Artikel zur Einführung von Android UvcCamera

Das Gerät ist mit einer externen USB-Kamera für grundlegende Vorschau, Foto- und Videoaufnahmen verbunden. Ich glaube, dass einige Studierende bei ihrer Arbeit auf ähnliche Bedürfnisse gestoßen sind.

UVC-Kamera? Unabhängig davon, ob Sie es schon einmal verwendet haben oder darauf gestoßen sind, glaube ich, dass es Ihnen nach dem Lesen dieses Artikels auf jeden Fall einige Vorteile bringen wird.

In diesem Artikel werden die folgenden Punkte näher erläutert:

     1. Was ist UVC?
     2. UVCCamera Open-Source-Projekt?
     3. Open-Source-Projektintegration?
     4. Kleinere Änderungen an der Demo, um während der Aufnahme einen Yuv-Stream in Echtzeit zu erhalten?
     5. Aufgetretene Probleme und Lösungen?

1. Was ist UVC?

Der vollständige Name von UVC lautet USB Video Class, und die direkte Übersetzung bedeutet: USB Video Class, ein Protokollstandard, der speziell für USB-Videoaufnahmegeräte definiert wurde.

Dieser Standard ist ein Protokollstandard, der für USB-Videoaufnahmegeräte definiert wurde und gemeinsam von Microsoft und mehreren anderen Geräteherstellern eingeführt wurde. Er hat sich zu einem der USB-Organisationsstandards entwickelt.

Die aktuellen Mainstream-Betriebssysteme stellen UVC-Gerätetreiber bereit, sodass Hardwaregeräte, die der UVC-Spezifikation entsprechen, normal im Host verwendet werden können, ohne dass Treiber installiert werden müssen. Ja, das aktuelle Android-System unterstützt bereits UVC-Geräte.

Zusammenfassung:

Apropos, jeder sollte ein solches Konzept haben, UVC ist ein Protokoll und verschiedene Geräte unterstützen möglicherweise unterschiedliche Protokolle. Wenn unsere USB-Kamera auf Android-Geräten unterstützt werden muss, muss es sich bei dieser Kamera um eine Kamera handeln, die das UVC-Protokoll unterstützt.

2. UVCCamera Open-Source-Projekt?

https://github.com/saki4510t/UVCCamera

Jetzt suchen wir im Internet nach Artikeln zu UVC-Kameras, und die Projekte zu UVC-Kameras, die wir finden können, basieren ohne Übertreibung im Wesentlichen auf dem oben genannten Open-Source-Projekt. Die Verpackung ist sehr gut, die Codelogik ist relativ klar Es ist sehr bequem zu bedienen und die grundlegenden Vorschau-, Foto- und Videofunktionen der Kamera wurden realisiert. Es handelt sich um ein relativ vollständiges Projekt.

Wir ziehen den Code zunächst lokal über Git Pull und importieren ihn in AndroidStudio (es ist auch möglich, den Code direkt ohne Git Pull herunterzuladen.

Wenn die Github-Website in China nicht über die Mauer geht, ist sie manchmal möglicherweise nicht zugänglich. Warum nicht? Sie können auch versuchen, auf Gitee nach diesem Projekt zum Herunterladen zu suchen.

9f8733dc0ffb1480198b3a47b6c1fc92.png

Die Verzeichnisstruktur des gesamten Projekts ist in der folgenden Abbildung dargestellt. Natürlich treten während des Importvorgangs einige Probleme bei der Fehlerberichterstattung auf. Tatsächlich handelt es sich hauptsächlich um ein Problem mit der Gradle-Version.

Für das Problem der Importfehler geben wir Ihnen später in diesem Artikel eine ausführliche Erklärung, einschließlich der aufgetretenen Probleme und deren Lösung.

083e0638c6af4af0d5433b126f87789d.png

In diesem Open-Source-Projekt stellt der Autor zusätzlich zum Quellcode der SDK-Bibliothek auch 8 Demos zur Verfügung. Die spezifischen Funktionen dieser 8 Demos werden wie folgt vorgestellt:

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控件。目前这只支持亮度和对比度。

Die Codelogik der bereitgestellten Demo ist sehr klar und Sie können die entsprechende Demo entsprechend Ihren Anforderungen anzeigen.

Diese Demos umfassen grundlegende Funktionen wie Vorschau, Aufnahme und Fotografieren. Die Anpassung von Helligkeit und Kontrast kann an unterschiedlichen Kameras liegen. Ich habe es vor Ort überprüft und festgestellt, dass es keine Auswirkungen hat. Wenn Schüler es später ausprobieren und es für effektiv halten, hinterlassen Sie mir bitte eine Nachricht, damit ich mit Ihnen kommunizieren kann.

Wir können sehen, dass Demo7 eine Demo ist, die 2 Kameras unterstützt. Wenn es mehrere Anforderungen an die Kameraunterstützung gibt, können Sie sich auf die Logik hier beziehen.

3. Zusammenstellung und Integration des Open-Source-Projekts UVCCaemra?

Der Kerncode von UVCCamera befindet sich in libuvcamera.

2a423b89062504a05e0df315754e9057.png

Wenn wir dieses Projekt in unser Projekt integrieren möchten, benötigen wir zwei Dinge: eines ist die SO-Bibliothek und das andere ist der Java SDK-Quellcode, der aufgerufen werden kann.

Aus dem Screenshot oben können wir deutlich erkennen, dass der Code hauptsächlich zwei Teile von JNI und Java enthält. Kompilieren Sie jni, um die so-Bibliothek zu erhalten, die wir benötigen. Der Java-Code kann in aar gepackt werden oder der gesamte Code kann direkt in unser Projektverzeichnis kopiert werden, das auch als Bibliotheksreferenz verwendet werden kann.

1) Zusammenstellung dieser Bibliothek

Jetzt ist die Kompilierung der SO-Bibliothek sehr praktisch. Wie in der folgenden Abbildung gezeigt, wechseln wir in das JNI-Verzeichnis in der Terminal-Terminalschnittstelle von AS und erstellen direkt ndk-build, um die benötigte SO-Bibliotheksdatei zu generieren.

7f0610f7064d54756def22f6a500bed4.png

Hier ist eine Stelle, auf die wir achten müssen, das heißt, wir benötigen Android 32-Bit- oder 64-Bit-Bibliotheksdateien, die in Application.mk konfiguriert sind. Ich habe den Speicherort der Application.mk-Datei im obigen Screenshot eingekreist . Wenn es 32-Bit ist, kann der Inhalt von APP_ABI hier in armeabi-v7a geändert werden, 64-Bit ist arm64-v8a und so weiter für andere Plattformen.

2) Pack aar

Wenn unser Projekt dieses Open-Source-Projekt integrieren möchte, müssen wir Java-Code bereitstellen, bevor wir es aufrufen können. Die Methode, die ich hier verwende, besteht darin, den Kerncode von UVCCamera (dh ohne 8 Demos) in aar zu packen und dann auf das gepackte aar in meinem eigenen Projektverzeichnis zu verweisen. Das Packen in aar ist auch in AS sehr einfach
. Poste zuerst das Bild.

197b71ee6220eccc8fe5a6b88c21077d.png

8a2be6120b1d6b9ad1ab15b5ff71c88c.png

Aus dem Screenshot oben können wir ersehen, dass zwei Module gepackt werden müssen: libuvccamera und usbCameraCommon.

Befolgen Sie die Abfolge der Vorgänge auf dem Screenshot, von 1 bis 3. Klicken Sie zunächst auf der rechten Seite der AS-Schnittstelle auf „Gradle“. Doppelklicken Sie in der freien Schnittstelle, um „assembleRelease“ auszuführen. Wenn nach der Ausführung kein Fehler auftritt, können Sie die generierte AAR-Datei unter dem Build-Ausgabepfad des Moduls sehen.

Der letzte Schritt besteht darin, die generierte SO-Bibliotheksdatei und die generierte AAR-Datei in das libs-Verzeichnis unseres eigenen Projekts zu kopieren und sie zur Verwendung in das Projekt zu importieren.

3) Integrieren Sie das UVCCamera SDK in unser eigenes Projekt
. Durch die oben genannten Schritte haben wir die SO-Bibliotheksdatei und die AAR-Datei erfolgreich kompiliert. Die folgende Abbildung zeigt, dass wir die generierten Dateien in unsere eigenen Engineering-Projekte importieren.

7d22a4489eb17e83a6291d90ba018d8b.png

4. Kleinere Änderungen an der Demo: Während der Videoaufnahme Echtzeit-YUV-Stream erhalten?

Ich habe bereits einen Artikel über uvcCamea geschrieben und die Adresse ist hier zusammen mit der Adresse der Demo veröffentlicht. Interessierte Studenten können auch einen Blick darauf werfen.

In dieser Demo habe ich zusätzlich zu den grundlegenden Vorschau-, Foto- und Videofunktionen auch eine Schnittstelle hinzugefügt, um den Echtzeit-YUV-Stream entsprechend meinen eigenen Anforderungen zurückzugeben. Wenn es notwendig ist, Echtzeit-Streaming-Videostreams wie Gesichtserkennung und Hochladen in den Hintergrund durchzuführen, kann dies meiner Meinung nach hilfreich sein.

„Ein Artikel führt Sie zum Verständnis der Android-USB-Kamera“
https://www.jianshu.com/p/35124f098c24

Demo-Adresse:
https://github.com/yorkZJC/UvcCameraDemo

Was meine eigene Demo betrifft: Wenn Sie die Auflösung ändern müssen, können Sie sie in der Datei MyConstants.java ändern, wie in der Abbildung unten gezeigt.

cfef4a608beec9e71bf660db69fe8107.png

Der Screenshot unten zeigt die Schnittstelle des Yuv-Stream- Rückrufs .

915d55c8f27de4304a38a90f8b8563a1.png

5. Aufgetretene Probleme und Lösungen?

1) SDK-, NDK-Konfiguration?

Im ersten Schritt müssen wir zuerst das SDK und das NKD konfigurieren. Ich glaube, dass viele Schüler das SDK konfigurieren können. Außerdem müssen wir NDK-Build verwenden, um die SO-Bibliothek zu kompilieren, daher muss das NDK ordnungsgemäß konfiguriert werden . Meine lokale NDK-Version ist r17, ich glaube, die Version dieses NDK hat kaum Auswirkungen.

Es gibt zwei Möglichkeiten, ndk zu konfigurieren: Sie können es direkt in der Datei local.properties ändern oder es konfigurieren, indem Sie unseren lokalen nkd-Pfad in der Ansichtsoberfläche und in der Projektstruktur auswählen.

Die folgenden Screenshots entsprechen diesen beiden unterschiedlichen Modifikationsmethoden, und Sie können jede davon verwenden.

d272bba55615933ac0fda9d67aa4055.png

0526c422eaea4e8f4d369698189b7dfa.png

2) Android Studio importieren, Gradle-Versionskonfiguration?

Im Folgenden sind einige Probleme aufgeführt, auf die ich gestoßen bin: Nach meinem Änderungsvorgang glaube ich, dass jeder ihn erfolgreich ausführen kann.
【Fehler 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

【Fehler2】

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

【Fehler3】

* 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)

Ich ziehe den Code lokal über Git Pull, sodass jede lokale Änderung über Git verfolgt und aufgezeichnet werden kann. Was den Kompilierungsfehler betrifft, schauen wir uns an, was ich insgesamt geändert habe.

5880535de8b6392d4978888f21f9e7a6.png

Im Screenshot oben sehen wir, dass insgesamt 5 Stellen geändert wurden.
   i. Änderung von build.gradle im Stammverzeichnis des Projekts;
  ii. Änderung von libuvcamera/build.gradle;

3) Wenn die USB-Kamera herausgezogen wird, wird die Anwendung aufgrund einer Absturzausnahme beendet?

Es gibt einen Fehler in der ursprünglichen Bibliotheksdatei. Wenn wir also die Kamera ausstecken, während wir die USB-Kamera verwenden, kommt es zu einem Absturz in der SO-Bibliothek, was dazu führt, dass unsere Anwendung direkt abnormal beendet wird.

Für dieses Problem haben andere große Götter im Internet Lösungen bereitgestellt, und ich werde die geänderten Orte hier veröffentlichen. Ich habe die Verifizierung auch persönlich geändert.

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) Einige USB-Kameras werden nicht erkannt?

Bei einigen Schülern besteht möglicherweise auch das Problem, dass einige USB-Kameras nicht erkannt werden. Hier gilt die Voraussetzung, dass bestätigt werden soll, dass die USB-Kamera erkannt und normal verwendet werden kann, wenn sie an den Computer angeschlossen ist. Sie kann jedoch nicht erkannt werden, wenn sie an unser Gerät angeschlossen ist.

Wenn Sie auf ein solches Problem stoßen, können Sie ein vollständiges Logcat-Protokoll abrufen, dann global im Protokoll nach Unterklassen suchen und die unterklassenbezogenen Informationen im Format des Screenshots unten in „device_filter.xml“ im XML-Verzeichnis konfigurieren.

fd91c005c83537d03053978f75e555e8.png

Über den Inhalt von uvcCamera erfahren Sie hier.

Vielen Dank fürs Lesen. Gerne können Sie auch gemeinsam kommunizieren.

Ich denke du magst

Origin blog.csdn.net/qq_27489007/article/details/131326292
Empfohlen
Rangfolge