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 :

Utiliser lame_enc.dll ou lame.exe en C#


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 39
    Par défaut Utiliser lame_enc.dll ou lame.exe en C#
    Bonjour,

    J'avais créé un sujet mais je me suis éloigné un peu de la question initiale, donc je développe ici mon probleme actuel :
    je travaille en C# (sur un webservice pour être précis) et je souhaite encoder des fichiers wav (PCM) en mp3.

    Pour cela je pense utiliser lame dont on m'a dit qu'il pouvait répondre à mon besoin. J'ai donc téléchargé sur internet une archive contenant une dll (lame_enc.dll) et un exécutable (lame.exe).

    D'abord j'ai essayé de référencer la librairie lame_enc.dll dans mon projet VS, sans succès.
    Donc je me penche en ce moment sur la librairie lame_enc.dll.
    Après avoir téléchargé sur le net, j'ai vérifié sur l'exe de demo fourni que je vais pouvoir encoder les pcm que j'ai en mp3. J'ai récupéré dewplayer sur le net pour faire simple, donc je me dis que je vais m'en sortir tranquille.

    Et puis non.

    Je ne suis pas arrivé à référencer le lame_enc.dll dans mon webservice.

    - si j'utilise "add reference" : je viens de télécharger la dll, je ne la trouve pas dans les onglets .net et com. donc je vais dans l'onglet browse pour le récupérer là où je l'ai mis.
    >> fenetre d'erreur lors du référencement "A reference to "...lame_enc.dll" could not be added. no type libraries were found in the component."

    - si j'essaie de le référencer "à la main" (d'apres ce que j'ai compris, ça revient à :
    *copier la dll dans le bin du projet webservice
    *double cliquer dessus pour voir la version (apparemment 3, 93, 1 0) et ajouter dans le web.config la ligne
    <add assembly="lame_enc, Version=3.93.1.0, Culture=neutral, PublicKeyToken=<ma_clé>"/>
    *et enfin rajouter un using lame_enc dans chaque classe ou je veux m'en servier (en l'occurence une seule)
    >> Erreur de compilation VS Error "Could not load file or assembly 'lame_enc, Version=3.93.1.0, Culture=neutral, PublicKeyToken=<...>' or one of its dependencies. The module was expected to contain an assembly manifest. C:\(...)Web.Config"
    l'erreur pointant sur la ligne que j'ai ajoutée dans le web.config.

    Il me semble qu'il y avait une manip à faire (aximp, sn ou quelque chose comme ça), sans laquelle le publickey n'était pas le bon, mais j'ai completement oublié les détails.

    Donc à supposer que cette dll soit celle dont j'ai besoin pour mon problème (encoder des pcm en mp3 en Csharp), comment la référencer? Je me noie un peu...
    Puis je me suis résolu à utiliser l'exécutable.
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    /* Encodage wav WAV -> MP3 via lame.exe
         * @param   string  wav_file    nom complet du fichier wav à encoder
         * @return  srinng  mp3_file    nom complet du fichier mp3 de sortie
         */
        [WebMethod]
        public string encodeWavToMp3(string wav_file)
        {
            try
            {
                // Vérifier l'existence de l'exécutable
                string exe_name = Server.MapPath("lame.exe");
                FileInfo ExeFile = new FileInfo(exe_name);
                if (!ExeFile.Exists)
                    throw new Exception("L'exécutable lame.exe est introuvable");
                // Vérifier l'existence du fichier
                FileInfo WavFile = new FileInfo(wav_file);
                if (!WavFile.Exists)
                    throw new Exception("Le fichier wav spécifié n'existe pas");
     
                // cmd> lame <fichier>.wav <fichier>.mp3            
                // Arguments
                string mp3_file = wav_file.Substring(0, wav_file.Length - 4) + ".mp3";
                string exe_args = "\"" + wav_file + "\" \"" + mp3_file + "\"";
     
                // Appel
                ProcessStartInfo processStartInfo = new ProcessStartInfo(exe_name, exe_args);
                processStartInfo.UseShellExecute = false;
                processStartInfo.ErrorDialog = false;
     
                // Encodage effectué avec succès
                return mp3_file;
            }//try
            catch (Exception ex)
            {
                return ex.Message;
            }//catch
        }//generateWavFile
    Mon code a l'air de marcher pour un fichier .wav de petite taille; par contre quand il s'agit d'un plus gros fichier (3Mo, 3 minutes) alors cela prend une éternité. Pourtant quand j'exécute lame sur ligne de commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >lame monfichier.wav monfichier.mp3
    l'encodage est fait en moins de 2 secondes pour une taille similaire.

    Donc j'en suis revenu à mon point de départ : "j'y arrive pas". Alors si quelqu'un a des pistes pour un des deux points suivants :

    - référencer lame_enc.dll dans mon projet, et m'en servir par la suite pour faire mon encodage;
    - un code C# qui lance la ligne de commande
    >lame monfichier.wav monfichier.mp3
    sans mettre 3 heures à chaque fois.


    Merci d'avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    On ne peut référencer que des assembly .NET ou des composants COM
    lame_enc.dll est une DLL native, donc tu ne peux pas la référencer dans ton projet.
    Par contre il est possible de l'utiliser en passant par P/Invoke. Ca suppose de connaître les signatures des fonctions exportées par la DLL (tu peux les trouver dans le .h qui va avec par exemple).
    Pour plus d'infos sur P/Invoke, va voir ce tutoriel :
    http://nico-pyright.developpez.com/t...vokeWithCSharp
    ou encore celui-ci :
    http://morpheus.developpez.com/dlldotnet/

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 39
    Par défaut
    Merci pour tes indications. On m'avait déja parlé du P/Invoke, il m'avait également semblé qu'il existait une façon de "wrapper" (je rebalance le terme sans l'avoir compris ) ou faire autre chose sur la dll pour en générer une autre, compatible .net pour le coup (aximp ou je ne sais plus)

    En attendant je suis tombé sur cette page :

    http://www.codeproject.com/KB/audio-...ompressor.aspx

    avec un code qui fait tout, bien plus même que mon besoin. Après l'avoir un peu customisé selon mes besoins, il s'intègre très bien dans mon projet

    C'est dommage que le temps me manque pour me plonger dans tout cela et comprendre vraiment comment ça marche, je vais devoir faire un copier-coller de l'arrache mais bon...

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par WeeJay Voir le message
    On m'avait déja parlé du P/Invoke, il m'avait également semblé qu'il existait une façon de "wrapper" (je rebalance le terme sans l'avoir compris ) ou faire autre chose sur la dll pour en générer une autre, compatible .net pour le coup (aximp ou je ne sais plus)
    Aximp permet de générer automatiquement un wrapper pour des composants COM ou ActiveX
    Pour une DLL native comme lame_enc.dll, il faut le faire manuellement...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 39
    Par défaut
    "manuellement", c'est à dire utiliser le P/invoke en faisant [DllImport("truc.dll")] et aller chercher les fonctions une par une, si j'ai bien compris...

    Ok merci, j'essaierai d'y penser à l'avenir.

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    salut,

    un peu tard, mais oui, il est possible de wrapper (encapsuler) des DLL C++ pour les utiliser en .Net, en passant par une tierce DLL écrite en Managed C++.

    C'est pas très dur (dépend de la DLL initiale) mais ca doit être fait à la main, donc ca nécessite de bien connaître ta DLL de base.

    L'énorme avantage est de pouvoir ainsi réutiliser des objets C++ en C#, ce que ne permet pas P/Invoke.
    C'est d'ailleurs utile uniquement si ta DLL est orientée objet, ce qui n'est peut-être pas le cas de lame.

  7. #7
    Membre éclairé
    Homme Profil pro
    consultant java
    Inscrit en
    Août 2010
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : consultant java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 325
    Par défaut
    bonjour,
    j'ai le meme souci que toi et j'ai besoin de ce que ta trouvé comem solution sauf que le lien ne fonctionne pas,


    merci

    Citation Envoyé par WeeJay Voir le message
    Merci pour tes indications. On m'avait déja parlé du P/Invoke, il m'avait également semblé qu'il existait une façon de "wrapper" (je rebalance le terme sans l'avoir compris ) ou faire autre chose sur la dll pour en générer une autre, compatible .net pour le coup (aximp ou je ne sais plus)

    En attendant je suis tombé sur cette page :

    http://www.codeproject.com/KB/audio-...ompressor.aspx

    avec un code qui fait tout, bien plus même que mon besoin. Après l'avoir un peu customisé selon mes besoins, il s'intègre très bien dans mon projet

    C'est dommage que le temps me manque pour me plonger dans tout cela et comprendre vraiment comment ça marche, je vais devoir faire un copier-coller de l'arrache mais bon...

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par mvc_dev Voir le message
    bonjour,
    j'ai le meme souci que toi et j'ai besoin de ce que ta trouvé comem solution sauf que le lien ne fonctionne pas,


    merci
    Le lien ayant deux ans, ce n'est pas forcément étonnant.

  9. #9
    Membre éclairé
    Homme Profil pro
    consultant java
    Inscrit en
    Août 2010
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : consultant java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 325
    Par défaut
    ok, je comprend.
    c'est juste que depuis une semaine que je galere pour avoir ce bout de code.
    pour convertir wav vers mp3 dans le meme traitement.

    c'est bien dommage.

    :s

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/01/2011, 17h38
  2. utiliser une DLL C++ dans un Exe Delphi
    Par rudi0 dans le forum Delphi
    Réponses: 1
    Dernier message: 13/12/2006, 22h49
  3. utilisation de dll avec diverses compilateurs
    Par Thylia dans le forum C++
    Réponses: 30
    Dernier message: 21/10/2004, 16h30
  4. Utilisation de dll
    Par David E dans le forum MFC
    Réponses: 11
    Dernier message: 04/02/2004, 14h09
  5. [CR] Infos sur l'utilisation de dll
    Par step dans le forum SAP Crystal Reports
    Réponses: 11
    Dernier message: 09/08/2002, 11h35

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