我正在编写一个.NET DirectShow应用程序,该应用程序可以从任何捕获设备捕获音频流,并使用LAME DirectShow过滤器在mp3中对其进行编码,最后将流写入文件中。
这是我的directshow图:
捕获源-> LAME AUDIO ENCODER(音频压缩器)-> WAV DEST(波多路复用器,从SDK编码编译)->文件编写器。

问题是我想以编程方式配置编码器(比特率,通道,VBR / CBR等),而不使用LAME编码器上可用的属性页(ISpecifyPropertyPages)。

检索LAME源后,似乎必须使用特定的IAudioEncoderProperties接口完成配置。

我试图使用以下声明在我的.NET应用程序中封送此COM接口:

 
 [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);
 }

Note that not all methods are redefined.

I can successfully cast my audio compressor filter (the LAME encoder) using:

IAudioEncoderProperties prop = mp3Filter as AudioEncoderProperties;


但是,当我调用get_Bitrate方法时,返回值为0,并且调用set_Bitrate方法似乎对输出文件没有影响。
我尝试使用属性页配置过滤器,并且可以正常工作。

因此,我想知道是否有人已经将LAME编码器用于DirectShow应用程序(是否为.NET),可以为我带来帮助吗?

问候。

-
赛弗

最佳答案

也许我来晚了,但是我遇到了同样的问题。解决方案是按照与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
}

07-26 09:37