2010-07-01 20 views
4

J'écris une application .NET DirectShow qui capture le flux audio de n'importe quel périphérique de capture, le code en mp3 en utilisant le filtre DirectShow de LAME et enfin écrit le flux dans un fichier. Ceci est mon graphique DirectShow: source de capture -> ENCODEUR AUDIO LAME (compresseur audio) -> WAV DEST (Wave muxer, compilé à partir de sources SDK) -> Auteur du fichier. Le problème est que je voudrais configurer l'encodeur (bitrate, canaux, VBR/CBR, etc) par programme et ne pas utiliser les pages de propriétés (ISpecifyPropertyPages) disponibles sur l'encodeur LAME. Après la récupération des sources LAME, il apparaît que la configuration doit être effectuée à l'aide de l'interface spécifique IAudioEncoderProperties.Configurer l'encodeur MP3 LAME dans l'application DirectShow en utilisant IAudioEncoderProperties

J'ai essayé de rassembler cette interface COM dans mon application .NET en utilisant cette déclaration:

 

[ComImport] 
[SuppressUnmanagedCodeSecurity] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
[Guid("ca7e9ef0-1cbe-11d3-8d29-00a0c94bbfee")] 
public interface IAudioEncoderProperties 
{ 
    // Get target compression bitrate in Kbits/s 
    int get_Bitrate(out int dwBitrate); 

    // Set target compression bitrate in Kbits/s 
    // Not all numbers available! See spec for details! 
    int set_Bitrate(int dwBitrate); 
} 

Notez que toutes les méthodes sont redéfinis.

Je jetai avec succès mon filtre compresseur audio (l'encodeur LAME) en utilisant:

IAudioEncoderProperties prop = mp3Filter as AudioEncoderProperties;

Mais quand je l'appelle méthode get_Bitrate la valeur retournée est 0 et appelant la méthode set_Bitrate semble avoir aucune incidence sur la sortie fichier. J'ai essayé de configurer mon filtre en utilisant les pages de propriétés et cela fonctionne. Donc, j'aimerais savoir si quelqu'un a déjà utilisé l'encodeur LAME dans une application DirectShow (.NET ou non) et pourrait m'apporter de l'aide?

Cordialement.

- Sypher

Répondre

1

Peut-être que je suis en retard, mais je couru dans le même problème. La solution consiste à déclarer les méthodes dans votre interface exactement dans le même ordre que celles déclarées dans les sources LAME.

[ComImport] 
[SuppressUnmanagedCodeSecurity] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
[Guid("ca7e9ef0-1cbe-11d3-8d29-00a0c94bbfee")] 
public interface IAudioEncoderProperties 
{ 
    /// <summary> 
    /// Is PES output enabled? Return TRUE or FALSE 
    /// </summary>  
    int get_PESOutputEnabled([Out] out int dwEnabled); 

    /// <summary> 
    /// Enable/disable PES output 
    /// </summary>  
    int set_PESOutputEnabled([In] int dwEnabled); 

    /// <summary> 
    /// Get target compression bitrate in Kbits/s 
    /// </summary>  
    int get_Bitrate([Out] out int dwBitrate); 

    /// <summary> 
    /// Set target compression bitrate in Kbits/s 
    /// Not all numbers available! See spec for details! 
    /// </summary>  
    int set_Bitrate([In] int dwBitrate); 

    ///... the rest of interface 
} 
+0

Cela fonctionne! Merci beaucoup! –