Настройте кодировщик LAME MP3 в приложении DirectShow с помощью IAudioEncoderProperties

Я пишу приложение .NET DirectShow, которое захватывает аудиопоток с любого устройства захвата, кодирует его в mp3 с помощью фильтра LAME directshow и, наконец, записывает поток в файл. Это мой график DirectShow: источник захвата -> LAME AUDIO ENCODER (Аудио компрессор) -> WAV DEST (волновой мультиплексор, скомпилированный из SDK sourcres) -> Запись файлов.

Проблема в том, что я хотел бы настроить кодировщик (битрейт, каналы, VBR / CBR и т. Д.) Программно, а не использовать страницы свойств (ISpecifyPropertyPages), доступные в кодировщике LAME.

После получения источников LAME кажется, что конфигурация должна выполняться с использованием определенного интерфейса IAudioEncoderProperties.

Я попытался маршалировать этот COM-интерфейс в своем .NET-приложении, используя это объявление:

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

Обратите внимание, что не все методы переопределяются.

Я могу успешно использовать свой фильтр аудиокомпрессора (кодировщик LAME), используя:

IAudioEncoderProperties prop = mp3Filter as AudioEncoderProperties;

Но когда я вызываю метод get_Bitrate, возвращаемое значение равно 0, а вызов метода set_Bitrate, похоже, не влияет на выходной файл. Я попытался настроить свой фильтр, используя страницы свойств, и он работает.

Итак, я хотел бы знать, использовал ли кто-нибудь кодировщик LAME в приложении DirectShow (.NET или нет) и мог бы мне помочь?

С Уважением.

- Сайфер


person Jerome Thievent    schedule 01.07.2010    source источник


Ответы (1)


Может, я опоздал, но столкнулся с той же проблемой. Решение состоит в том, чтобы объявить методы в вашем интерфейсе в том же порядке, в каком они объявлены в источниках 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
}
person MadBender    schedule 05.04.2011