IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Solution de capture flux Audio et Video en C# [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 27
    Par défaut Solution de capture flux Audio et Video en C#
    Bonjour,

    Mon but est de faire une application de gestion de vidéos (tri) avec la possibilité d'un enregistrer via une webcam.

    Je me suis lancé dans la programmation de mon appli en C# pensant que le langage était adapté, mais après une grosse journée de recherche (8h devant google), je me rend compte que ce n'est peut-être pas le cas.

    Donc je cherche à enregistrer simplement le flux vidéo et audio d'une webcam puis créer un fichier.avi ou autre. L'important étant qu'un fichier soit enregistré et que je puisse définir les compressions pour gérer le poids du fichier.

    Pour enregistrer le flux vidéo, j'ai téléchargé AForge.net, qui est très sympa mais ne me permet pas de capturer le son.
    Et ensuite je n'ai rien trouver de vraiment précis. Je me suis tourné vers la possibilité d'utiliser DirectShow et DirectSound mais la version de DirectX SDK en téléchargement sur le site de MS à l'air d'être que pour le C++, je n'arrive pas à implémenter les library dans mon projet C#.

    Et je dois avouer que je suis un gros débutant (très motivé), mais débutant quand même, donc je ne sais pas si il est possible de capturer le flux vidéo avec Aforge par exemple et simultanément de capturer l'audio avec une autre library puis d'assembler les deux.

    Donc en fait je suis assez dans le flou concernant mes possibilités, donc je suis preneur de toutes idées ou solutions ou conseils. N'importe quoi qui pourrait m'aider à réaliser mon appli.

    Merci

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    tu peux utiliser Slimdx (www.slimdx.org) qui est un "wrapper" .Net au dessus de DirectX 10/11 et qui permet l'utilisation de directX en C# sans faire de C++...

    Sinon, effectivement, avec AForge.Net, tu vas capturer la vidéo, pas le son. Mais je pense que la question relative au son doit etre évoquer sur les forums de Aforge.Net

    Voilà

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 27
    Par défaut
    Merci pour ta réponse.

    Je suis en train d'essayer plusieurs choses avec SlimdDX, en effet.
    J'ai essayé d'utiliser la library Alvas, mais par manque de Docs, je suis pas allé très loin.

    Je crée mon WaveFormat et mon buffer avec le Device voulue, mais je bloque pour enregistrer le son dans un .wav.

    J'essaie avec FileStream de System.IO et WaveStream de SlimDX mais il doit avoir un truc que je pige pas.

    Voila une partie de mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     this.captureDevice = new DirectSoundCapture(this.listDevices[this.cboSoundDevice.SelectedIndex].DriverGuid);
     
                WaveFormat waveFormat = new WaveFormat();
                waveFormat.FormatTag = WaveFormatTag.IeeeFloat;
                waveFormat.BitsPerSample = 32;
                waveFormat.BlockAlignment = (short)(waveFormat.BitsPerSample / 8);
                waveFormat.Channels = 1;
                waveFormat.SamplesPerSecond = 44100;
                waveFormat.AverageBytesPerSecond = waveFormat.SamplesPerSecond * waveFormat.BlockAlignment * waveFormat.Channels;
     
                CaptureBufferDescription bufferDescription = new CaptureBufferDescription();
                bufferDescription.BufferBytes = 8192;
                bufferDescription.Format = waveFormat;
                bufferDescription.WaveMapped = false;
     
                CaptureBuffer buffer = new CaptureBuffer(this.captureDevice, bufferDescription);      
                this.fs = new FileStream(Constante.CHEMINMEDIA + Constante.CHEMINFICHIER + "essai_audio.wav",FileMode.Create);     
                buffer.Start(true);
    Et en fait c'est là que je bloque. Je ne sais pas comment utiliser les classes
    FileStream ou WaveStream pour enregistrer. J'ai essayer beaucoup de choses provenant de tuto, mais pour l'instant, choux blanc...

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    Je ne me souviens pas comment je faisais mais de mémoire,

    avec DirectX, tu récupères les buffers de données provenant de la carte son, et ensuite avec le filestream, tu utilises une méthode d'ajout d'octet et le tour est joué.

    On trouve plein de tutoriaux pour enregistrer du son en C# (pas forcément avec DirectX, souvent avec Winmmi si je me souviens bien)...

    Bon courage (t surement plus très loin du résultat)

    T'as cherché sur le forum Aforge.net pour le son ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 27
    Par défaut
    Merci pour ta réponse.

    Oui sur le forum d'Aforge j'ai cherché, et pas de réponse, sauf que AForge ne propose aucune option pour l'instant concernant le son.

    Sinon le soucis est que tous les exemples sur le net utilise la library DirectX qui n'est plus compatible maintenant, et SlimDX ou autre ne sont pas exactement pareil.
    Alors je sais qu'il doit bien avoir une solution mais pour quelqu'un comme moi qui ne s'y connait pas trop dans le son, je galère un peu.

    En fait d'après ce que j'ai trouvé, j'y suis presque oui, mais j'ai juste du mal a enregistrer le son.
    Si je résume, j'ai mon objet SoundCaptureDevice (Capture pour DirectX) qui est ma source de son.
    J'instancie WaveFormat avec lequel je paramètre le son que je veux récupéré (je sais c'est flou, mais ce que j'ai compris).
    Ensuite je crée mon objet CaptureBufferDescription pour paramétrer mon buffer que j'instancie avec mon SoundCaptureDevice et mon CaptureBufferDescription.

    Alors déjà là j'ai pas vraiment réussit à avoir une description simple du buffer. Je sais que que c'est un espace alloué dans la mémoire. D'après ce que je peux deviner, c'est l'endroit ou va être stocké le son qui provient du micro. C'est pas trop technique comme termes... Désolé.

    Donc ensuite dans ma logique, il faut maintenant enregistrer ce qui est dans le buffer et d'après ce que j'ai vu ce sont des bytes.

    Et pour enregistrer, j'ai filestream et WaveStream. Vu que j'utilise SlimDx, je me suis dis autant essayer de l'utiliser jusqu'au bout, donc je dispose des méthodes:

    1)BeginWrite(array<Byte>[], Int32, Int32, AsyncCallback, Object)

    byte[] buffer,
    int offset,
    int count,
    AsyncCallback callback,
    Object state

    2)WriteByte(Byte)
    byte value

    Et c'est là ou je coince. La première je ne pige pas trop les paramètres à utilisé, et la deuxième je ne trouve pas comment envoyé des byte avec mon buffer, les méthodes ne le permettent pas directement en tout cas.

    Pour FileStream, je dispose de:

    Write(Array[], int, int)
    byte[] array,
    int offset,
    int count

    Et...Bah c'est un peu le même problème qu'au dessus.
    Dans les exemples que j'ai trouvé, les personnes déclarent un array de byte, mais il faut bien que je fasse quelque chose avec cet array, sinon j'ai du mal a comprendre comment il pourrait aider... Enfin je suppose que vous l'avez compris, c'est là ou je pige pas la manip


    Et bon je ne suis pas vraiment sur de mon code non plus, ça me parait très simpliste. Mais bon c'est un début, je vais déjà me concentrer avec ce code pour obtenir un résultat, on verra après l'amélioration et l'optimisation.

    Merci

  6. #6
    Membre très actif Avatar de miripesage
    Homme Profil pro
    gerant
    Inscrit en
    Novembre 2009
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : gerant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2009
    Messages : 725
    Par défaut
    Bonsoir, jette un coup d'oeil ICI.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Capture flux audio système
    Par mabsou dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 13/07/2013, 23h03
  2. Capture du flux audio d'un device
    Par kertimanoff dans le forum C#
    Réponses: 4
    Dernier message: 28/09/2010, 13h56
  3. Capture flux video
    Par Albat90 dans le forum Dynamique
    Réponses: 1
    Dernier message: 12/01/2010, 16h34
  4. Redirection de flux audio/video
    Par wallain dans le forum C++
    Réponses: 0
    Dernier message: 26/08/2009, 11h02
  5. capture flux video impossible
    Par mystercedric dans le forum Firefox
    Réponses: 1
    Dernier message: 09/08/2009, 19h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo