Vidéo en temps réel de l'encodage en DirectShow
J'ai développé une application Windows qui permet une capture vidéo à partir d'un périphérique externe à l'aide de DirectShow. La résolution de l'image est de 640x480 et les vidéos enregistrées sans compression, de très de très grande taille (approx. 27 MO par seconde).
Mon objectif est de réduire cette taille, autant que possible, je suis à la recherche d'un codeur qui va me permettre de compresser la vidéo en temps réel. Il pourrait être H. 264, MPEG-2 ou quoi que ce soit d'autre. Il doit me permettre d'enregistrer la vidéo sur le disque et il serait mieux si je pouvais aussi le diffuser en temps réel sur le réseau (Wi-Fi gratuite, de sorte que la taille doit être d'environ 1 MO par seconde, ou moins). L'importante perte de qualité serait inacceptable.
J'ai trouvé que l'obtention d'une approprié filtre DirectShow pour cette tâche est très difficile. Il peut être supposé que le client de la machine est assez moderne (fast 2-core) et d'utiliser CUDA/OpenCL. Il ya quelques applications qui permettent d'encoder de la vidéo à l'aide de CUDA et offrent de bonnes performances, mais je n'ai pas trouvé le filtre DirectShow ou une API qui pourrait être utilisé pour développer un. La NVIDIA nvcuvenc.dll semble avoir API privée donc je suis incapable de l'utiliser directement. CPU en fonction des encodeurs j'ai trouvé sont trop lent pour mes besoins, mais j'ai peut-être manqué quelques-uns.
Quelqu'un pourrait-il me recommander une solution, c'est à dire un codeur (payant ou gratuit, qui peut être utilisé dans un code source fermé app) qui permet de réaliser une bonne performance, peu importe si c'est à l'aide de CPU/CUDA/OpenCL ou de DirectCompute? Ou peut-être que je devrait utiliser un matériel externe encodeur vidéo?
Cordialement,
madbadger
- Ne sais pas si vous avez trouvé une solution pour le présent, mais dans un même temps, j'ai développé des Flux de Transport de codage pour mon produit - peut-être qu'une telle solution serait également acceptable pour vous puisque vous parlez de diffusion en continu via le WiFi
Vous devez vous connecter pour publier un commentaire.
Puisque vous êtes en utilisant Directshow, de loin, la meilleure chose à faire serait d'utiliser WMV9 à l'intérieur d'un conteneur ASF. C'est plus facile, car il est disponible sur presque toutes les machines Windows (très peu de temps d'installation des dépendances), décemment rapide (vous devriez avoir aucun problème à l'utiliser raisonnablement moderne de la machine) et la qualité est raisonnable. Mais compte tenu de votre limite est de 8 mbit/s (1 MO/s), la qualité n'est pas un problème pour vous. 2 mbit/s, VGA-résolution WMV9 devrait regarder très bon.
Ce n'est pas presque aussi bon comme un décent, la mise en œuvre de H264, mais à partir d'un point de vue de la mise en œuvre, vous allez gagner beaucoup de temps par aller dans cette voie.
Voir ceci:
http://msdn.microsoft.com/en-us/library/dd375008%28v=VS.85%29.aspx
Les filtres avez-vous essayé?
Si vous êtes seulement à faire avec 640x480, toute raisonnable, de qualité commerciale basée sur le logiciel codeur doit être très bien aussi longtemps que vous choisissez un réaliste débit. L'accélération matérielle à l'aide de Cuda ou OpenCL ne devrait pas être nécessaire. H264 prend un peu plus de puissance en chevaux et aurait besoin de plus de cœurs du PROCESSEUR, mais en Mpeg2 ou aucun des h263 de l'époque de codecs (divx, wmv9, divx, etc) ne devraient avoir aucun problème, même sur un modeste PROCESSEUR. En Streaming sur le réseau en même temps il prend un peu plus d'effort, mais il devrait toujours être possible.
Ce n'est pas DirectShow, mais VLC Media Player pouvez faire tout cela. Il est basé sur la FFMpeg projet open-source. Certaines versions sont LGPL-licence, de sorte que la bibliothèque pourrait intégrer à votre projet sans trop de restrictions.
Si vous voulez juste un ensemble de filtres DirectShow qui se chargera de tout pour vous, j'ai eu de bons résultats avec MainConcept de l' des produits avant de. Ils sont à la chère extrémité du spectre, cependant.
Vous ne spécifiez les filtres que vous avez essayé, ou ce "significative" de la qualité de la perte de moyens, donc sur le meilleur, je pense que nous pouvons faire est de suggérer quelques codeurs pour essayer de voir s'ils répondent à vos exigences.
Deux bons sont le Theora et WebM video encoder les filtres (vous pouvez les obtenir à partir d'un seul programme d'installation à xiph.org). Ils sont à la fois de haute qualité codeurs qui peuvent être réglées à l'équilibre entre les performances et la qualité. WebM pouvez utiliser plusieurs processeurs lors de l'encodage, ce qui pourrait aider dans votre situation. Les deux sont également utilisés w/vidéo HTML5, donc cela pourrait être un petit plus pour vous.
Oublier WMV encodage en temps réel en streaming. WMV fonctionne bien en temps réel faible qualité des cours d'eau, mais il ne fait pas de haute qualité d'encodage en temps réel.
Je vous suggère de prendre un coup d'oeil à MainConcept du SDK. Ils font une série de filtres DirectShow pour l'encodage H. 264. J'ai mis en œuvre en temps réel de streaming et de multiplexage de flux encodés en H. 264 à l'aide de MainConcept de codecs et de filtres DirectShow, et c'est génial.
Espère que cette aide
Je suis avec Windows Media Encoder pour l'encodage en temps réel, et cela fonctionne bien, même dans la résolution de 720x576. Un exemple de son utilisation est en VideoPhill Enregistreur.
Il est écrit dans le plus pur .NET avec DirectShow.NET pour la capture et le windowsMedia.NET pour l'encodage.
À l'aide de ces deux que je suis en mesure de réaliser d'encodage en temps réel 24/7 stabilité.
Et les deux bibliothèques sont libres de l'utiliser sur Windows, de sorte que vous n'aurez pas à payer des licences, sauf pour les OS.
ffdshow tryouts de levier ffmpeg x264 stuff, qui est dit être assez rapide (je pense de toute façon). Aussi libjpeg-turbo peut aider, ou du choix d'une autre codec faite pour le haut débit comme camstudio ou ce n'est pas.
mise à jour: ffmpeg peut prendre d'entrée directshow maintenant: http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=3&t=27
Avez-vous vu cela?
http://www.streamcoders.com/products/rtpavsource.html
http://www.streamcoders.com/products/rtpavrender.html
Si vous pouvez rester au-dessous de 1280x1024, Micorsofts encodeur MPEG-2 (inclus dans Vista) est assez bonne.
Je n'ai pas eu à le faire fonctionner pour 1080p contenu à tout cela. Je soupçonne que le codeur juste abandonne sur que. La honte.
Ici est une option : http://www.codeproject.com/Articles/421869/H-264-CUDA-Encoder-DirectShow-Filter-in-Csharp
Il utilise environ 10% de mon cpu (p4 3ghz) pour encoder une vidéo SD en h264 dans le graphique modifier.
Voir le CaptureDS exemple C# qui vient avec AVBlocks. Il montre comment construire un enregistreur vidéo avec AVBlocks et DirectShow. DirectShow est utilisé pour la capture vidéo et AVBlocks est utilisé pour l'encodage vidéo: