2016-05-05 18 views
11

Vogliamo elaborare i dati di anteprima della fotocamera a 120 fps (o 60 fps) utilizzando l'assemblaggio Neon o gli shader GPU per eseguire una semplice operazione di elaborazione delle immagini (ad es. Convoluzione 3x3). Non siamo interessati a visualizzare l'immagine sullo schermo in modo che i dati della fotocamera debbano passare direttamente a SurfaceTexture.60/120fps visualizza i dati di anteprima su un dispositivo Android?

Abbiamo pensato di poterlo fare utilizzando l'API Camera2 su un Nexus 5 utilizzando CameraConstrainedHighSpeedCaptureSession ma non ci siamo riusciti.

Non esiste un codice attualmente funzionante su Internet (almeno la parte che abbiamo raschiato) che lo consente e tuttavia sembra probabile che la funzionalità esista.

Il miglior esempio di utilizzo delle API Camera2 per la registrazione ad alta velocità è qui: https://github.com/PkmX/lcamera

Al fine di cercare di incoraggiare qualcuno a postare una soluzione sto mettendo una taglia su questo problema.

risposta

1

Abbiamo modificato con successo l'esempio di camera2video per ottenere una velocità di trasmissione di 120 fps su un Samsung S6.

Il codice è here.

Non siamo ancora riusciti a estrarre i pixel, ma aggiorneremo qui quando lo faremo.

+0

Hai trovato un modo per leggere i dati del frame? – Alex

1

Questo è realizzato in pjsip. Tirare il repo nella vostra macchina:

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

quindi aprire la cartella pjmedia/src/swig per esempio, un app che rende i dati video in ingresso dal filo direttamente a un SurfaceTexture.

ho caricato i due file di origine C più rilevanti (a colpo d'occhio — ci sono certamente altri) per voi, qui:

  1. android_dev.c
  2. android_opengl.c

Naturalmente, i file contiene un sacco di codice irrilevante per te, ma si spera che abbia lo snippet che stai cercando.

Potrebbe essere necessario prima seguire alcune delle istruzioni found here per generare i file pjmedia/src/pjmedia-videodev/android/PjCamera*.java che gestiscono l'interfaccia Java/C minimalista se non si è sicuri di come farlo. Sono stato in grado di seguire le loro istruzioni — utilizzando esattamente le stesse versioni per NDK (funziona con 10d o 10e) e openssl (1.0.2a) — e con successo il rendering del video e creare un'app personalizzata. Questa fonte realizza esattamente ciò che stai cercando se modifichi l'acquisizione video a livello C per utilizzare la tua API tramite gli hook JNI nello stesso modo in cui lo fanno.

Per un esempio di utilizzo degli hook JNI per modificare l'API, dare un'occhiata alla loro cartella audiodev in pjmedia.

Se si crea il progetto, assicurarsi di seguire le istruzioni in fondo per le versioni NDK più recenti per la creazione di openssl 1.0.2a. Nota la "C" maiuscola in ./Configure, poiché l'esecuzione dello standard ./configure potrebbe avviare il processo di configurazione errato. Suggerisco di copiare e incollare i comandi forniti in uno script. Potresti essere in grado di saltare openssl interamente per i tuoi scopi; Sono riuscito a far sì che i miei dispositivi Android potessero registrare costantemente gli account SIP una volta integrato il supporto di openssl.

+0

Grazie per la risposta dettagliata. Sei riuscito a ottenere 60 o 120 fps dal flusso? – twerdster

+0

Dipende dal dispositivo, ma sicuramente: tra 2 dispositivi moderni, posso trasmettere in streaming dalla telecamera in tempo reale alla massima risoluzione, che è (per me) limitata di solito a 30 o 60 fps (w/comunicazione dell'intero flusso a un secondo dispositivo per il rendering come in pjsip). Su un dispositivo locale che esegue il rendering direttamente su una trama nascosta, il framerate massimo che ho visto è ~ 200 fps. – EntangledLoops

+0

60fps dalla fotocamera? Cosa intendi per 200 fps? Im specificamente chiedendo di frame provenienti dalla fotocamera del dispositivo fisico. E quali dispositivi stai usando? – twerdster

Problemi correlati