Android-Kamera onPreviewFrame Bildrate ist nicht konsistent
Ich versuche zu Kodieren eine 30 frames pro Sekunde video mit MediaCodec durch die Kamera PreviewCall zurück(onPreviewFrame). Das video, das ich codiert spielt immer sehr schnell(das ist nicht gewünscht).
So, ich habe versucht zu überprüfen, die Anzahl der frames, die kommt in meine Kamera-Vorschau durch die Einrichtung eines int frameCount variable zu erinnern, seine Zählung. Was ich erwarte ist 30 frames pro Sekunde, weil ich meine setup-Kamera-Vorschau zu 30 fps-Vorschau(siehe unten). Das Ergebnis, dass ich wieder komme ist nicht das gleiche.
Ich rief die onPreviewFrame Rückruf für die 10 Sekunden, die Anzahl der frameCount ich wieder komme ist nur etwa 100 Bilder. Das ist schlecht, da warte ich auf 300 frames. Ist meine Kamera-Parameter richtig eingestellt? Ist das eine Einschränkung von Android Kamera-Vorschau rufen Sie zurück? Und wenn dies ist eine Einschränkung der Android-Kamera-Vorschau rufen Sie zurück, dann ist es eine andere Kamera-Rückruf, zurück, Kamera-Bild-Daten(nv21,yuv, yv12) bei 30 frames pro Sekunde?
vielen Dank für das Lesen und deine Zeit für ein helpout. ich würde schätzen alle Kommentare und Meinungen.
Hier ist ein Beispiel für ein kodiertes video mit Kamera onPreviewFrame:
http://www.youtube.com/watch?v=I1Eg2bvrHLM&feature=youtu.werden
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewFormat(ImageFormat.NV21);
parameters.setPictureSize(previewWidth,previewHeight);
parameters.setPreviewSize(previewWidth, previewHeight);
// parameters.setPreviewFpsRange(30000,30000);
parameters.setPreviewFrameRate(30);
mCamera.setParameters(parameters);
mCamera.setPreviewCallback(previewCallback);
mCamera.setPreviewDisplay(holder);
- Unterschiedliche Geräte haben unterschiedliche Funktionen. Ist 30fps im Bereich zurückgegeben, die von developer.android.com/reference/android/hardware/... ?
- Mein Gerät zurückgegeben, eine Reihe von 5000-30000, ich denke, meine Frage ist jetzt, wie Sie die rate fix, damit es nicht schwankt die ganze Zeit?
- gibt es andere Möglichkeiten, um die Kamera-frame-Daten anderen als Kamera onPreviewFrame Rückruf?
- Sie können die systemeigene Kamera intrface, als OpenCV tut, statt onPreviewFrame(), aber es ist nicht sicherer, nicht schneller und nicht offiziell unterstützt. Es wird keine überwindung der variable range-problem. Ich würde nur empfehlen, diese Möglichkeit für video-Aufnahme, wenn Sie mit hardware-encoder, die Kamera zu Lesen-Puffer im kernel-Adressraum.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, die Android-Kamera garantiert nicht stabile Framerate, vor allem bei 30 FPS. Es kann zum Beispiel wählen Sie eine längere Exposition bei niedrigen Lichtverhältnissen.
Aber es gibt einige Möglichkeiten, wie wir, den app-Entwicklern, kann alles noch schlimmer machen.
Ersten, die durch die Verwendung
setPreviewCallback()
stattsetPreviewCallbackWithBuffer()
. Dies kann dazu führen, dass unnötige Druck auf den garbage collector.Zweite, wenn
onPreviewFrame()
kommt auf die main (UI) - thread, Sie verursachen keine UI-Aktion direkt die Verzögerung der Kamera-frames eintreffen. HaltenonPreviewFrame()
auf einem separaten thread aus auf, sollten Sieopen()
Sie die Kamera auf einem sekundären Greiferfaden. Hier habe ich im detail erklärt, wie dies erreicht werden kann: Beste Verwendung HandlerThread gegenüber anderen ähnlichen Klassen.Dritte, überprüfen Sie, dass die Bearbeitungszeit weniger als 20ms.