2017-02-10 2 views
0

abrufen Wie ich in einem früheren Post beschrieben, ich arbeite an einer Android-App für die erweiterte Echtzeit-Visualisierung einer Drohne Kameraansicht (speziell arbeite ich auf einem DJI Phantom 3 Professional mit relativem SDK), mit Wikitude Framework für den AR Teil. Dank Alex's response habe ich meine eigene Wikitude Input Plugin in Kombination mit dji's Video Stream Decoding implementiert.Wie NV21 Daten von DJI Kamera Phantom 3 Professional Drohne

Ich habe jetzt ein paar Probleme. Zuallererst verwendet die "DJI's Video Stream Decoding" -Demo FFmpeg für Video Frame Parsing und MediaCodec für Hardware Decoding. Es hilft also, Videobilder zu analysieren und die rohen Videostream-Daten von DJI Camera zu dekodieren und die YUV-Daten auszugeben. Sie rieten mir, "die rohen Videodaten von der dji sdk zu holen und sie an das Wikitude SDK weiterzugeben": Da das Wikitude Input Plugin das YUV 420-Format benötigt, das dem NV21-Standard entspricht, um die benutzerdefinierte Kamera zu liefern, sollte ich übergeben Sie ihm den YUV-Datenausgang des MediaCodec, richtig?

Über diesen Punkt versuchte ich Bytepuffer von der MediaCodec-Ausgabe abzurufen (und dies ist möglich durch Festlegen von Surface-Parameter auf Null in configure() -Methode, die einen Callback aufrufen und an einen externen Listener übergeben), aber ich habe ein paar Probleme mit Farben in der Visualisierung, weil die kodierte Videofarbe nicht richtig ist (Blau und Rot scheinen umgekehrt zu sein, und es gibt zu viel Rauschen, wenn sich die Kamera bewegt) .. (Bitte beachten Sie, dass wenn Übergeben Sie eine Oberfläche nicht null, nach der Anweisung codec.releaseOutputBuffer (outIndex, true), MediaCodec rendert Frames und zeigt Video-Stream richtig, aber ich muss den Video-Stream an Wikitude Plugin übergeben und so muss ich Oberfläche auf Null setzen).

Ich habe versucht, verschiedene MediaFormat.KEY_COLOR_FORMAT zu setzen, aber keiner von ihnen funktioniert ordnungsgemäß. Wie kann ich diesen Punkt lösen?

Antwort

0

Beim Decodieren in Bytepuffer mit MediaCodec können Sie nicht entscheiden, welches Farbformat der Puffer verwendet; der Decoder entscheidet, und Sie müssen damit umgehen. Jeder Decoder kann ein anderes Format verwenden; einige von ihnen können ein Standardformat wie COLOR_FormatYUV420Planar (entsprechend I420) oder COLOR_FormatYUV420SemiPlanar (entsprechend NV12 - nicht NV21) sein, während andere vollständig proprietäre Formate verwenden können.

Siehe z.B. https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java#401 für ein Beispiel, welche Formate der Decoder zurückgeben kann, die unterstützt werden, und https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java#963 für eine Referenz, die zeigt, dass es für Dekoder ok ist, private Formate zurückzugeben.

Sie können sich z.B. http://git.videolan.org/?p=vlc.git;a=blob;f=modules/codec/omxil/qcom.c;h=301e9150ae66075ca264e83566504802ed57578c;hb=bdc690e9c0e2516c00a6d3733a77a87a25d9b6e3 für ein Beispiel zur Interpretation eines gemeinsamen proprietären Farbformats.

Verwandte Themen