2016-05-05 9 views
11

Wir möchten 120 fps (oder 60fps) Kameravorschaudaten mit Neon-Assembly- oder GPU-Shadern verarbeiten, um eine einfache Bildverarbeitungsoperation durchzuführen (z. B. 3x3-Faltung). Wir sind NICHT daran interessiert, das Bild auf dem Bildschirm anzuzeigen, damit die Kameradaten direkt in ein SurfaceTexture gelangen.60/120fps Vorschau Daten auf einem Android-Gerät?

Wir dachten, wir könnten dies mit Camera2 API auf einem Nexus 5 mit CameraConstrainedHighSpeedCaptureSession tun, waren aber nicht erfolgreich.

Es gibt derzeit keinen funktionierenden Code im Internet (zumindest den Teil, den wir gekratzt haben), der dies erlaubt und dennoch scheint es wahrscheinlich, dass die Funktionalität existiert.

Das beste Beispiel für die Camera2 API für High-Speed-Aufzeichnung verwendet, ist hier: https://github.com/PkmX/lcamera

Um zu versuchen, jemanden zu ermutigen, eine Lösung schreiben ich auf diese Frage eine Prämie bin setzen.

Antwort

1

Wir haben das camera2video-Beispiel erfolgreich modifiziert, um eine Datenrate von 120 fps auf einem Samsung S6 zu erhalten.

Der Code lautet here.

Wir haben es noch nicht geschafft, die Pixel zu extrahieren, werden aber hier aktualisieren, wenn wir das tun.

+0

Haben Sie eine Möglichkeit gefunden, die Rahmendaten zu lesen? – Alex

1

Dies wird in pjsip erreicht. Ziehen Sie den Repo auf Ihre Maschine:

svn checkout -r 4687 https://svn.pjsip.org/repos/pjproject/trunk 

dann die pjmedia/src/swig Ordner für einen Beispiel-App öffnen, die aus dem Draht direkt an ein SurfaceTexture eingehenden Videodaten wiedergibt.

ich die beiden wichtigsten C-Quelldateien (auf einen Blick — es gibt sicherlich andere) hochgeladen haben für Sie, hier:

  1. android_dev.c
  2. android_opengl.c

, natürlich diese Dateien enthalten viele irrelevanten Code für Sie, aber hoffentlich haben Sie das Snippet, das Sie suchen.

Sie müssen möglicherweise zuerst einige der Anweisungen found here befolgen, um die pjmedia/src/pjmedia-videodev/android/PjCamera*.java Dateien zu generieren, die die minimalistische Java/C-Schnittstelle verarbeiten, wenn Sie nicht sicher sind, wie Sie dies tun. Ich konnte ihren Anweisungen — mit genau die gleichen Versionen für die NDK (funktioniert w/10d oder 10e) und openssl (1.0.2a) — folgen und Video erfolgreich rendern und eine benutzerdefinierte App erstellen. Diese Quelle erfüllt genau das, wonach Sie suchen, wenn Sie nur die C-Level-Videoaufnahme ändern, um Ihre API über JNI-Hooks auf die gleiche Weise zu nutzen.

Ein Beispiel für die Verwendung von JNI-Hooks zum Ändern der API finden Sie in ihrem audiodev-Ordner in pjmedia.

Wenn Sie ihr Projekt erstellen, befolgen Sie unbedingt die Anweisungen ganz unten für die neueren NDK-Versionen zum Erstellen openssl 1.0.2a. Beachten Sie, dass der Hauptschlüssel 'C' auf ./Configure steht, da das Ausführen des Standards ./configure möglicherweise den falschen Konfigurationsprozess startet. Ich empfehle, die bereitgestellten Befehle in ein Skript zu kopieren und einzufügen. Sie können openssl möglicherweise vollständig für Ihre Zwecke überspringen. Ich konnte meine Android-Geräte nur dann dauerhaft registrieren, wenn ich die OpenSSL-Unterstützung integriert habe.

+0

Danke für die ausführliche Antwort. Hast du es geschafft, 60 oder 120 fps aus dem Stream zu bekommen? – twerdster

+0

Es hängt vom Gerät ab, aber definitiv: zwischen 2 modernen Geräten kann ich von der Kamera in Echtzeit mit maximaler Auflösung streamen, was (für mich) normalerweise auf 30 oder 60 fps begrenzt ist (w/Kommunikation des vollen Streams zu ein zweites Gerät zum Rendern wie in pjsip). Auf einem lokalen Gerät, das direkt auf eine verborgene Textur rendert, beträgt die maximale Framerate ~ 200 fps. – EntangledLoops

+0

60fps von der Kamera? Was meinst du mit 200 fps? Ich frage speziell nach Frames, die von der Kamera des physischen Geräts kommen. Und welche Geräte verwendest du? – twerdster