Воспроизведение аудио в .Net / C # - PullRequest
10 голосов
/ 19 июля 2011

Я многолетний опытный программист MFC, который последние годы занимается разработкой коммерческих приложений для Objective C для Mac и iOS - я пытаюсь освоиться с .Net и C # (как я скоро потребуется преобразовать одно из моих коммерческих приложений с Mac на ПК).

Теперь я пробежался по нескольким книгам и в качестве упражнения, чтобы лучше познакомиться с .Net (и C #), я решил попробовать преобразовать одно из моих некоммерческих приложений в .Net как учебное упражнение, и все идет хорошо (интерфейс работает, структуры данных все хорошо), но мне нужно уметь проигрывать аудио.

Приложение для моего Mac генерирует аудио из серии математических формул - представьте себе генератор волн - не совсем то же самое, но похоже. На Mac я генерирую аудио в виде 16-битного подписанного необработанного звука, использую Core Audio для настройки маршрутизации аудиовыхода, а затем получаю обратный вызов всякий раз, когда требуется новый буфер аудио для маршрутизации звука (чтобы я мог генерировать звук на лету) .

Мне нужно сделать то же самое на ПК. К сожалению, я нахожу, что документация MSDN относится к случаю «Не вижу дрова для деревьев», поскольку существует огромное количество документации. Я могу найти классы, которые позволят мне загружать и воспроизводить файлы mp3 / wav и т. Д., Но мне нужно генерировать аудио в реальном времени. Кто-нибудь может указать мне правильное направление, чтобы найти что-то, что позволит мне заполнять буферы на лету, пока они их воспроизводят?

Thx

Ответы [ 5 ]

8 голосов
/ 19 июля 2011

Я использовал этот образец в нескольких проектах с хорошими результатами. В основном это оболочка .Net для Windows Waveform Audio API с использованием P / Invoke . Другие варианты:

3 голосов
/ 19 июля 2011

Я создал класс, который может воспроизводить аудио, используя Stream производное в качестве входных данных.Поэтому, если вы можете упаковать свой звуковой генератор в Stream совместимый интерфейс, он может подойти вам.

Как я это сделал - я использовал неуправляемые waveOut* методы из старого мультимедийного API Windows,и обработал воспроизведение оттуда.

Другие варианты - о которых я знаю - используйте waveOut напрямую, из этого: http://windowsmedianet.sourceforge.net/ или напишите свой собственный фильтр исходного кода DirectShow, но это может быть слишкомсложный, поскольку он должен быть написан на c ++.

Если вы заинтересованы в том, чтобы попробовать мой компонент, я могу сделать его доступным для вас бесплатно, так как мне нужен бета-тестирование (я использовал только егов нескольких моих проектах).

РЕДАКТИРОВАТЬ:

Поскольку существует 6 голосов за этот вопрос, я предлагаю свой компонент бесплатно (если вы считаете полезным) здесь: http://dl.dropbox.com/u/10020780/SimpleAudioPlayer.zip

Может быть, вы можете поразмышлять об этом:)

2 голосов
/ 19 июля 2011

Вы должны взглянуть на FMOD , который позволяет этот тип операции и многое другое. Это также кроссплатформенная платформа, которая может быть интересна, если вы также работаете на Mac.

2 голосов
/ 19 июля 2011

Я использую Audiere для достижения этой цели и считаю, что она работает очень хорошо.

Это действительно C ++ lib, но для C # доступен набор привязок .

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

1 голос
/ 12 февраля 2014

Alvas.Audio имеет 3 аудиоплеера: Плеер

        player.FileName = "123.mp3";
        player.Play();

PlayerEx

        public static void TestPlayerEx()
        {
            PlayerEx plex = new PlayerEx();
            plex.Done += new PlayerEx.DoneEventHandler(plex_Done);
            Mp3Reader mr = new Mp3Reader(File.OpenRead("in.mp3"));
            IntPtr format = mr.ReadFormat();
            byte[] data = mr.ReadData();
            mr.Close();
            plex.OpenPlayer(format);
            plex.AddData(data);
            plex.StartPlay();
        }

        static void plex_Done(object sender, DoneEventArgs e)
        {
            if (e.IsEndPlaying)
            {
                ((PlayerEx)sender).ClosePlayer();
            }
        }

и RecordPlayer

        public static void TestRecordPlayer()
        {
            RecordPlayer rp = new RecordPlayer();
            rp.PropertyChanged += new PropertyChangedEventHandler(rp_PropertyChanged);
            rp.Open(new Mp3Reader(File.OpenRead("in.mp3")));
            rp.Play();
        }

        static void rp_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            switch (e.PropertyName)
            {
                case RecordPlayer.StateProperty:
                    RecordPlayer rp = ((RecordPlayer)sender);
                    if (rp.State == DeviceState.Stopped)
                    {
                        rp.Close();
                    }
                    break;
            }
        }
...