11
votes

Dessiner sur la vidéo dans C #

Je fais une application qui permettra aux utilisateurs d'appliquer certains outils pour analyser des vidéos et des images. J'ai besoin d'aide avec comment je dessine / écrit sur la vidéo chargée dans Windows Media Player de mon formulaire et de pouvoir l'enregistrer. Il doit être en mesure de savoir à l'utilisateur de dessiner à main levée et à former. Merci d'avance,

chris :)


1 commentaires

Voir ma nouvelle édition: vous pouvez toujours utiliser WPF pour la fenêtre d'édition vidéo et Winforms pour le reste de votre application.


6 Réponses :


1
votes

Si vous utilisez WPF, essayez placer un INKCANVAS sur le dessus de votre vidéo et réglage de l'arrière-plan transparent. Vous pouvez ensuite enregistrer et charger les formes que les utilisateurs se dessinent sur la vidéo.

Un peu de preuve de concept avec une image au lieu d'une vidéo:

text alt

Je suppose que vous pouvez utiliser WinForms, où cela peut être plus difficile. Si oui, une bonne excuse pour apprendre WPF!


edit: avec Winforms, vous devrez faire votre propre contrôle personnalisé qui sert de superposition transparente et d'ajouter des coups de pinceau. Il serait extrêmement difficile de bien mettre en œuvre (avec un fond transparent, qui ne joue pas bien avec Winforms). Je recommanderais d'utiliser WPF si vous êtes toujours à une étape, vous pouvez modifier l'interface utilisateur de votre application. WPF fonctionne sur XP et UP.


EDIT2: après googling, il y a des équivalents inkcanvas que les gens ont fait pour WinForms, mais je ne sais pas à quel point ils sont bons et ne pas prendre en charge des antécédents transparents.

Vous pouvez toujours avoir la vidéo que vous souhaitez annotée dans une nouvelle fenêtre WPF et le reste de votre application dans Winforms.


1 commentaires

Alors, que dois-je faire parce que je le fais sur une winform dans XP?



2
votes

Ceci est une tâche non négligeable, sinon impossible à réaliser avec le contrôle de wmp en WinForms.

Je ne sais pas de toute façon de tirer réellement sur le WMP mais vous pouvez dessiner sur un panneau transparent superposera à la partie WMP. Cela ne fonctionnera pas sera la lecture de la vidéo, mais vous pouvez montrer le dessin pendant qu'il est en pause. Je l'ai utilisé cette technique pour dessiner sur un contrôle vidéo 3ème partie qui fonctionne de façon similaire à wmp . (Edit - cela ne semble pas fonctionner avec le contrôle de WMP)

Cependant, comme des panneaux transparents réels sont aussi assez délicate dans WinForms, une autre façon serait de saisir une image de la vidéo et d'en tirer sur l'image superposée. Encore une fois, seulement quand il est en pause.

Ce contrôle commercial ne permet le dessin sur la vidéo. Il a un événement qui se déclenche chaque image que vous pouvez utiliser pour faire le dessin. Le gros inconvénient, bien que vous ne pouvez pas vraiment faire quelque chose de trop de fantaisie que vos besoins en routine de dessin pour se terminer avant le prochain cadre est dessiné.

Je vous encourage fortement à utiliser WPF (même si son un contrôle WPF hébergé dans une application WinForms) pour montrer votre vidéo. Il est beaucoup plus facile de tirer sur la vidéo (y compris la vidéo de jeu) dans WPF.

EDIT

Je dessin viens de tester sur le wmp en utilisant un panneau transparent et son ne se comporte pas comme mon contrôle 3e parti a fait, alors je vous suggère de faire le peu de jeu vidéo dans WPF et hôte dans votre winForms application. (Je viens de tester cela aussi en utilisant la suggestion de @Callums et fonctionne comme un charme)


9 commentaires

Merci, mais comment puis-je faire cette technique de mettre un WPF dans une winform? Ou dois-je vous en débarrasser complètement et simplement le refaire sur WPF? Mais s'il y a un moyen dans lequel je n'ai pas à supprimer et à changer mon projet en WPF, alors cela serait idéal :)


@Chris: Vous pouvez mettre un contrôle WinForm dans WPF mais pas l'inverse.


@Callum - pas true - Vous pouvez héberger un contrôle WPF dans une application Winforms: msdn.microsoft.com/en-us/library/...


@gwoff: oh wow, apprenez quelque chose de nouveau tous les jours. Ensuite, le problème est résolu, peut-être, il peut écrire le bit vidéo + annotations dans WPF et l'organiser dans son application WinForms.


@Callum - Oui, c'est ce que je ferais.


@Callum & @gwoff, c'est super merci de votre aide, mais cette technique me permettra ensuite de sauvegarder les annotations à ce sujet pour une référence future si j'utilise un SaveFileDialog?


@Chris, oui Jetez un coup d'œil à codeProject.com/kb/wpf/ink1. ASPX # SaveSFISF . En outre, si ma réponse ou mes commentaires vous a aidés, veuillez envisager de susciter ma réponse :)


@Chris - Vous ne pourrez pas enregistrer les annotations sur la vidéo, si c'est ce que vous voulez dire. Pour cela, vous êtes dans le monde des composants tiers pour ré-encoder la vidéo. Sinon, vous devez enregistrer les annotations séparément avec le temps de la vidéo, afin que vous puissiez les "rejouer" sur la vidéo. Vous devrez peut-être mettre en œuvre votre propre mécanisme de dessin à l'aide d'événements de la souris si les encrs ne fournissent pas suffisamment de flexibilité.


Ok merci, mais comment puis-je faire cette inkcanvas qui me permet de sauvegarder les annotations séparément pour jouer à nouveau sur la vidéo?



-2
votes

OK, de loin et loin la meilleure façon de procéder est d'utiliser Silverlight. Silverlight prend en charge tous les principaux formats de streaming et fournit également un accès complet à la tramebuffer.

facile: -)


3 commentaires

Silverlight n'est qu'un sous-ensemble de WPF conçu pour être utilisé avec des pages Web.


Je ne suis pas suivi? Veuillez vous reporter à WPFSLGUIDANCE.CODEPLEX.COM/Relases/Voir/30311 . Ce n'est pas simplement un sous-ensemble de WPF, une fois des principales différences, c'est que c'est facile de distribuer des applications Silverlight via le Web. Voir la suppression de la superposition vidéo en Silverlight pour plus d'informations.


@Chris possède déjà une application WinForms existante qu'il souhaite cette fonctionnalité. Comment Silverlight résoudra-t-il cela? Aussi SL ne peut pas fonctionner en pleine confiance (surélevé-oui mais non complet) et le Mediakement SL ne peut que jouer de la vidéo WMV VC-1 ou H.264 hors de la boîte. WMP ou WPF MediaPlayer peut lire toutes les vidéos que l'utilisateur dispose des codecs installés.



0
votes

Vous pouvez regarder XNA (www.xna.com) de Microsoft. Il est fait pour les langages gérés comme c # et devrait Vidéo de support .

Je ne l'ai utilisé que pour dessiner en C #, mais cela fait le travail.

Je devrais également noter que XNA fonctionnera dans le cadre d'une application régulière Windows Forms. Pour ce que ça vaut, j'ai également prototypé quelque chose comme ça avec Flash; Flash vous permet d'importer chaque image du fichier vidéo dans l'éditeur et de créer un SWF pouvant répondre à l'interaction de l'utilisateur.

Cependant, cette approche est inutile si vous devez mettre à jour le film en temps réel. Flash (dernier que j'ai vérifié) ne pourrait importer le film que sur conception temps.


0 commentaires

1
votes

J'ai trouvé comment faire ça.
Voici une solution dans le WPF à l'aide de toile xxx

puis crée des événements de souris pour la toile et dessine avec elle xxx


0 commentaires

1
votes

Ceci peut être fait dans Winforms mais ce n'est pas facile. Il existe un support de formulaire transparent avec alpha mélange dans Winforms. Utilisez les créatures suivantes pour la formulaire de superposition transparente: ws_ex_layered, ws_ex_transparent. Vérifiez les références MSDN pour ce type de fenêtre: http://msdn.microsoft.com /en-us/library/ms997507.aspx , http://msdn.microsoft.com/en-us/library/ms632599%28vs.85%29.aspx#Layered .

Mettez une forme transparente au-dessus de votre contrôle vidéo et vous pouvez dessiner tout ce que vous voulez dessus. Déplacer et redimensionner les événements doivent être coordonnés entre votre fenêtre vidéo et la forme transparente au-dessus de celle-ci. Redessinant la superposition doit utiliser UpdateLayeredWindow () dans user32.dll.

J'ai appris un peu de cet exemple: http: // www .codeproject.com / Articles / 13558 / AllowAgRADientPanel-A-Extended-Panel .


0 commentaires