Настройте кодировщик LAME MP3 в приложении DirectShow, используя IAudioEncoderProperties - PullRequest
4 голосов
/ 01 июля 2010

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

Проблема в том, что я хотел бы настроить кодер (битрейт, каналы, 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 или нет) и мог бы помочь мне?

Привет.

- Sypher

1 Ответ

1 голос
/ 05 апреля 2011

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