Как передать звук с микрофона на динамик?

Я хочу передавать звук напрямую с микрофона на носитель звука по умолчанию, будь то динамик или разъем 3,5 мм.

Механизмы, которые я обнаружил для воспроизведения звука, по-видимому, зависят от предоставления статического количества байтов для воспроизведения в SoundEffect, например:

SoundEffect sound = new SoundEffect(stream.ToArray(), microphone.SampleRate, AudioChannels.Mono);
soundInstance = sound.CreateInstance();
soundIsPlaying = true;
soundInstance.Play();

Я мог бы постоянно воспроизводить SoundEffects продолжительностью 500 мс или меньше для достижения своей цели, но мне было интересно, существует ли более сложный способ, который включает в себя постоянную запись микрофона в MemoryStream, который элемент управления воспроизведением звука может постоянно считывать.

Спасибо за любую помощь!


person Nico    schedule 18.01.2013    source источник
comment
Если вы используете основной динамик и микрофон, обратная связь, вероятно, сделает этот звук довольно плохим. Подумайте о действительно плохом спикерфоне с задержкой и свистом... Это тот эффект, который вам нужен?   -  person Paul Annetts    schedule 19.01.2013
comment
Я специально нацелен на разъем 3,5 мм, но я не был уверен, насколько плохой будет обратная связь, поэтому я оставил динамик в своем вопросе. Вы правы, хотя, я не хочу этого эффекта.   -  person Nico    schedule 19.01.2013


Ответы (2)


Я приступил к решению этой проблемы, расширив класс MediaStreamSource классом, который использовал микрофон для передачи образцов в проигрыватель MediaElement.

Если есть спрос на этот блок кода, я с радостью размещу его где-нибудь. А пока вот фрагмент кода, который поможет вам, если вы пытаетесь сделать то же самое:

// Provides audio samples from AudioSampleProvider property.
//  (MediaStreamType parameter will always equal Audio.)
protected override void GetSampleAsync(MediaStreamType mediaStreamType)
{
    // start the microphone capture if it's not started yet
    if (microphone.State == MicrophoneState.Stopped)
    {
        microphone.Start();
    }
}

// gets called back when the microphone's buffer is ready
private void microphone_BufferReady(object sender, EventArgs e)
{
    // Retrieve audio data
    microphone.GetData(buffer);

    // Reset MemoryStream object
    memoryStream.Seek(0, SeekOrigin.Begin);

    // Write the newly acquired data into the memory stream
    memoryStream.Write(buffer, 0, buffer.Length);

    // Send out the sample
    ReportGetSampleCompleted(new MediaStreamSample(mediaStreamDescription,
                                                    memoryStream,
                                                    0,
                                                    buffer.Length,
                                                    0, 
                                                    mediaSampleAttributes));
}

По сути, вы просто сообщаете, что семпл готов всякий раз, когда возвращается буфер микрофона. Это приводит к плавному воспроизведению.

person Nico    schedule 07.03.2013
comment
Я поиграю с этим позже, чтобы убедиться, что смогу следовать, но я хотел сказать, что, скорее всего, мне хотелось бы увидеть ваш пример кода. Я собираюсь сделать это еще немного, и мне, вероятно, понадобится вся помощь, которую я могу получить. Ваш расширенный MediaStreamSource может быть именно тем, что мне нужно для начала. - person w0rd-driven; 02.05.2013
comment
Конечно, я загрузил для вас весь проект по адресу: sdrv.ms/16vz7Jb. Это приложение от Мегафона, которое просто повторяет все, что он слышит в динамике. Но имейте в виду, что акустического эхоподавления нет, поэтому он будет бешено эхом, если микрофон сможет улавливать выходной сигнал динамика. - person Nico; 03.05.2013
comment
Большое спасибо, сэр. Я поиграю с ним позже, чтобы увидеть, насколько он близок к тому, что я собираюсь сделать. Я надеялся объединить вход микрофона с воспроизведением музыки, чтобы, если я слушаю наушники во время вождения (единственная звуковая система, которая у меня есть :/), я мог уловить больше фонового шума. Я почему-то сомневаюсь, что микрофон работает как обычные окна, где вы можете просто предварительно просмотреть вход микрофона и получить тот же эффект, потому что мне не нужно записывать микрофон. Я думаю, ты подойдешь ко мне очень близко, и за это я благодарю тебя. - person w0rd-driven; 10.05.2013
comment
Я желаю вам удачи в ваших начинаниях, дайте мне знать, если вам нужна помощь. - person Nico; 10.05.2013

Нико

При попытке вашего проекта MegaPhone я столкнулся со следующей ошибкой «Ссылка на объект не указывает на экземпляр объекта». Можешь взглянуть? Спасибо

at MS.Internal.XcpImports.CheckHResult(UInt32 hr) at MS.Internal.XcpImports.MediaStreamSource_OnGetSampleCompleted(MediaElement mediaElement, Int32 streamIndex, StreamInteropWrapper streamWrapper, InternalStreamWrapper internalStream, Int64 offset, Int64 count, Int64 timeInHundredNanoseconds, Int64 durationInHundred ] attributeLengths, атрибуты StringBuilder) в System.Windows.Controls.MediaElement.MediaSourceReportGetSampleCompleted(MediaStreamSample mediaStreamSample) в System.Windows.Media.MediaStreamSource.ReportGetSampleCompleted(MediaStreamSample mediaStreamSample) в Megaphone.MicrophoneSource.microphone_BufferReady(отправитель объекта, EventArgs e) в Microsoft. Xna.Framework.Audio.Microphone.OnBufferReady(аргументы EventArgs) в Microsoft.Xna.Framework.Audio.MicrophoneCollection.OnBufferReady(дескриптор UInt32) в Microsoft.Xna.Framework.FrameworkDispatcher.Update() в Megaphone.MainPage.dt_Tick(отправитель объекта , EventArgs e)

person peanut    schedule 27.01.2014