2017-09-05 3 views
6

En supposant que nous avons un Surface dans Android qui affiche une vidéo (par exemple H264) avec un MediaPlayer:vidéo dans Android: modifier les propriétés visuelles (par exemple, la saturation, la luminosité)

1) Est-il possible de changer la saturation affichée, contraste & luminosité de l'affichage sur la surface vidéo? En temps réel? Par exemple. Les images peuvent utiliser setColorFilter est-il quelque chose de similaire dans Android pour traiter les images vidéo?

question alternative (si pas 1 est trop difficile.): Si nous voulons exporter cette vidéo avec par exemple

2) une saturation accrue, nous devrions utiliser un codec, par ex. MediaCodec. Quelle technologie (méthode, classe, bibliothèque, etc ...) devons-nous utiliser avant l'action codec/save pour appliquer le changement de saturation?

+0

Voulez-vous une bibliothèque prête à l'emploi qui peut manipuler la vidéo pour l'affichage (comme dans la réponse ci-dessous), ou avez-vous d'autres exigences qui ne le permettent pas? Le projet lié dans la réponse montre l'utilisation d'un 'GLSurfaceView' avec un' MediaPlayer' et l'application de shaders OpenGL pour effectuer le filtrage sur l'affichage. C'est certainement une approche raisonnable si vous n'avez pas besoin d'exporter la vidéo filtrée. D'où vient votre 'Surface' à partir de maintenant? – Dave

+0

Salut @Dave, j'étudie actuellement comment il est possible à la fois d'ajuster la vidéo affichée (généralement en surface) mais aussi d'exporter la vidéo ajustée. Donc je n'ai pas de 'Surface' concrète - c'est ce que je cherche :) – Diolor

Répondre

2

Pour l'affichage uniquement, une approche simple consiste à utiliser un GLSurfaceView, un SurfaceTexture pour afficher les images vidéo et un MediaPlayer. La réponse de Prokash renvoie à une bibliothèque open source qui montre comment y parvenir. Il existe un certain nombre d'autres exemples si vous recherchez ces termes ensemble. En prenant cette route, vous dessinez des images vidéo sur une texture OpenGL et créez des shaders OpenGL pour manipuler le rendu de la texture. (Je suggère de demander Prokash pour plus de détails et accepter sa réponse si cela suffit pour remplir vos exigences.)

De même, vous pouvez utiliser les outils OpenGL avec MediaCodec et MediaExtractor pour décoder les trames vidéo. Le MediaCodec serait configuré pour sortir vers un SurfaceTexture, donc vous n'aurez pas besoin de faire beaucoup plus que de coder un élément standard pour obtenir les tampons de sortie rendus. Le processus de filtrage serait le même qu'avec un MediaPlayer. Il existe un certain nombre d'exemples utilisant MediaCodec en tant que décodeur disponible, par ex. here et here. Il devrait être assez simple de remplacer le TextureView ou SurfaceView utilisé dans ces exemples avec le GLSurfaceView de l'exemple de Prokash. L'avantage de cette approche est que vous avez accès à toutes les pistes séparées du fichier multimédia. Pour cette raison, vous devriez être capable de filtrer la piste vidéo avec OpenGL et de copier directement les autres pistes pour l'exportation. Vous utiliseriez un MediaCodec en mode d'encodage avec le Surface du GLSurfaceView comme entrée et un MediaMuxer pour tout reconstituer. Vous pouvez voir plusieurs exemples pertinents au BigFlake.

Vous pouvez utiliser un MediaCodec sans Surface pour accéder directement aux données d'octets décodées et les manipuler de cette manière. This example illustre cette approche. Vous pouvez manipuler les données et les envoyer à un encodeur pour exportation ou les rendre comme bon vous semble. Il y a une complexité supplémentaire dans le traitement des données d'octets brutes. Notez que j'aime cet exemple car il illustre comment traiter séparément les pistes audio et vidéo.

Vous pouvez également utiliser FFMpeg, soit en code natif, soit via l'un des wrappers Java. Cette option est plus orientée vers l'exportation que la lecture immédiate. Voir here ou here pour certaines bibliothèques qui tentent de rendre FFMpeg disponible pour Java. Ils sont essentiellement des wrappers autour de l'interface de ligne de commande. Vous auriez besoin de faire un peu de travail supplémentaire pour gérer la lecture via FFMpeg, mais c'est définitivement faisable.

Si vous avez des questions, n'hésitez pas à demander, et je vais essayer d'expliquer quelle option est la plus logique pour votre cas d'utilisation.

+0

Salut Dave, tu réponds définitivement à la générosité car c'est très analytique. La solution la plus équilibrée pour créer des filtres visuels et les exporter ressemble au travail manuel avec 'MediaCodec'. Pour sûr, je cherche si je peux utiliser FFMpeg (qui semble génial) avec une certaine possibilité de "prévisualisation" aussi. Merci! – Diolor

1

Si vous utilisez un lecteur prenant en charge les filtres vidéo, vous pouvez le faire.

Exemple d'un tel joueur est VLC, qui est construit autour de FFMPEG [1].

VLC est assez facile à compiler pour Android. Ensuite, tout ce dont vous avez besoin est le libvlc (fichier aar) et vous pouvez créer votre propre application. Voir les instructions de compilation here.

Vous aurez également besoin de write your own module. Juste en dupliquer un existant et le modifier. Inutile de dire que VLC offre de puissantes capacités de transcodage et de streaming. Comme VLC puissant pour Android est, il a un énorme inconvénient - les filtres vidéo ne peuvent pas travailler avec le décodage matériel (Android uniquement). Cela signifie que tout le traitement vidéo est sur le CPU.


Vos autres options sont d'utiliser GLSL/OpenGL sur des surfaces telles que GLSurfaceView et TextureView. Cette garantie GPU power.