2010-12-18 3 views
1

J'ai besoin de capturer de la vidéo et de l'enregistrer sur le disque dur toutes les xxx minutes. Ce sera win-service, qui est toujours en train de capturer et d'enregistrer. Il y aurait plusieurs caméras, donc je pense utiliser le fil de traitement par caméra. Donc, si je décide d'utiliser Thread au lieu de timer, je devrais utiliser Thread.Sleep avant d'enregistrer l'opération. À mon avis, ce n'est pas une bonne pratique.Multithreading capture vidéo

Donc la question est ma conception (fil par caméra) appropriée à ma situation? Qu'en est-il des minuteurs? Merci, Andrew

+2

Comment capturez-vous la vidéo? Quelles API utilisez-vous? Je demande parce que si vous utilisez DirectShow, vous pouvez enregistrer la vidéo en direct sans même bloquer le fil actuel. –

+0

Oui, j'utilise la bibliothèque DirectShowNet. Que veux-tu dire sans bloquer. Comment devrais-je vider strean sur le disque toutes les 5 minutes. –

Répondre

0

Votre code peut obtenir des blocages occasionnels en raison de mutex globaux (par exemple, dans le pilote). De même, par exemple, vous avez une entrée ouverte dans un thread, vous le rincez dans un flux et vous voulez le lire depuis un autre thread: le verrouillage mutex se produit. Même avec les minuteries. Compte tenu de la machine événementielle trop difficile à mettre en œuvre ici, vous pouvez toujours à plusieurs instances fallback ..

+0

Je pense que nous devons supposer que 1) les pilotes sont thread-safe et 2) que le programmeur est capable de mettre en œuvre des threads (avec des considérations pour les mutex et deadlocks). Au moins avoir quelque chose pour sauvegarder l'hypothèse que les pilotes ne sont pas thread safe. :) –

0

Vous pouvez consulter le code du projet open-source Media Portal à http://www.team-mediaportal.com/

Regardez leurs sous-projet appelé TvEngine3.

Vous pouvez le forcer à représenter graphiquement vos caméras en tant que périphérique «Tuner» et le configurer pour enregistrer via api. Point est, ils ont travaillé sur des centaines de problèmes DirectShow, et il ya beaucoup.

0

Je choisirais définitivement un fil par caméra car il y a de fortes chances que vous utilisiez moins de 20-30 caméras. Mais il n'est probablement pas nécessaire car la lecture d'une caméra (généralement) est une opération non bloquante.

Il existe plusieurs questions sur la webcam et la vidéo en C# sur SO. Essayez de regarder How do I capture video from a webcam?

Notez que vous pouvez pré-allouer de gros blocs de données pour éviter la fragmentation du disque. Stocker plusieurs vidéos en streaming sur le disque pourrait vraiment fragmenter les choses, puis regarder/copier/modifier les vidéos serait vraiment lent.