Beide ja und nein, je nachdem, was Sie tun.
Wenn Sie die rohen Bytes aus dem Kameravorschau-Callback erhalten, müssen die Pixeldaten vom Medienserverprozess in den Prozess Ihrer App und von Ihrer App zurück in den Medienserverprozess in den Encoder übertragen werden. Die Pixeldaten werden vollständig im YUV-Format gespeichert, aber Ihre App muss sie möglicherweise von einem YUV-Layout in ein anderes konvertieren (Encoder können Pixeldaten in einigen verschiedenen Formaten akzeptieren, die nicht unbedingt die gleichen sind wie die Kamera bietet in der öffentlichen API).
Wenn Sie die Frames von der Kamera über EGL/OpenGL an den Encoder übergeben, müssen die eigentlichen Pixeldaten nicht in Ihren Prozess einfließen, sondern werden in undurchsichtigen Oberflächen gespeichert, wobei alle Formatkonvertierungen von der Grafikhardware übernommen werden . Dies beinhaltet einerseits das Konvertieren der Pixeldaten von YUV von der Kamera in RGB, wenn sie durch OpenGL gehen, zurück in YUV, wenn zum Codierer gegangen wird, aber all dies wird abstrahiert.
Je nach Qualität und Menge der Optimierungen, die für die Kameratreiber und EGL/OpenGL-Treiber ausgegeben wurden, kann dieser Ansatz wahrscheinlich genauso schnell oder schneller sein. Vor allem, wenn Sie die Bilddaten bearbeiten möchten, wenn dies in einem GL-Shader möglich ist. Der Callback-Ansatz für die Kameravorschau scheint einfacher zu sein, hat jedoch einen hohen Aufwand, um die Daten in den Prozess Ihrer App zu leiten.
War neugierig selbst, aber ich sehe onCameraPreview nicht in der Android-Dokumentation. Worauf beziehen Sie sich? –
es heißt 'onPreviewFrame' eigentlich https://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html – MichelReap