2017-02-10 3 views
0

Comme je l'ai décrit dans un post précédent, je travaille sur une application mobile Android orientée vers la visualisation en temps réel augmentée de la vue d'un drone (spécifiquement je travaille sur un DJI Phantom 3 Professional avec SDK relatif), en utilisant le framework Wikitude pour la partie AR. Merci à Alex's response, j'ai mis en œuvre mon propre Wikitude Input Plugin en combinaison avec dji's Video Stream Decoding.comment récupérer les données NV21 de la caméra DJI Phantom 3 Professional drone

J'ai quelques problèmes maintenant. Tout d'abord, la démo "Video Stream Decoding" de DJI utilise FFmpeg pour l'analyse d'images vidéo et MediaCodec pour le décodage matériel. Ainsi, il est utile d'analyser les images vidéo et de décoder les données de flux vidéo brutes provenant de la caméra DJI et de sortir les données YUV. Vous m'a conseillé de "récupérer les données vidéo brutes du dji sdk et de les transmettre au Wikitude SDK": puisque Wikitude Input Plugin a besoin du format YUV 420, arrangé pour être conforme à la norme NV21 afin de fournir la caméra personnalisée, je devrais passer à la sortie de données YUV du MediaCodec, non? A ce propos, j'ai essayé d'extraire les bytebuffers de la sortie MediaCodec (et ceci est possible en définissant le paramètre Surface à null dans la méthode configure(), ce qui a pour effet d'appeler un callback et de le transmettre à un écouteur externe), mais j'ai des problèmes de couleurs dans la visualisation, parce que la couleur vidéo codée n'est pas bonne (le bleu et le rouge semblent être inversés, et il y a trop de bruit quand la caméra bouge). passez une Surface non nulle, après l'instruction codec.releaseOutputBuffer (outIndex, true), MediaCodec restitue les cadres sur cela et affiche le flux vidéo correctement, mais je dois passer le flux vidéo à Wikitude Plugin et donc je dois mettre surface à null).

J'ai essayé de définir différents MediaFormat.KEY_COLOR_FORMAT mais aucun d'eux ne fonctionne correctement. Comment puis-je résoudre ce problème?

Répondre

0

Lors du décodage en bytebuffers avec MediaCodec, vous ne pouvez pas décider du format de couleur utilisé par le tampon; le décodeur décide, et vous devez faire avec. Chaque décodeur peut utiliser un format différent; certains d'entre eux peuvent être un format standard comme COLOR_FormatYUV420Planar (correspondant à I420) ou COLOR_FormatYUV420SemiPlanar (correspondant à NV12 - pas NV21), tandis que d'autres peuvent utiliser des formats entièrement propriétaires.

Voir par exemple. https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java#401 pour un exemple sur les formats pouvant être renvoyés par le décodeur et https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java#963 pour une référence indiquant que les décodeurs peuvent retourner des formats privés.

Vous pouvez jeter un coup d'œil, par ex. http://git.videolan.org/?p=vlc.git;a=blob;f=modules/codec/omxil/qcom.c;h=301e9150ae66075ca264e83566504802ed57578c;hb=bdc690e9c0e2516c00a6d3733a77a87a25d9b6e3 pour un exemple sur la façon d'interpréter un format de couleur propriétaire commun.