Как да предавам аудио от микрофон към високоговорител?

Търся да предавам аудио директно от микрофона към аудио изходния носител по подразбиране, независимо дали е високоговорителят или 3,5 мм жак.

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

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

Бих могъл непрекъснато да възпроизвеждам SoundEffects от 500 ms или по-малко, за да постигна целта си, но се чудех дали има по-сложен начин, който включва непрекъснато записване на микрофона в 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 Player.

Ако има търсене на този блок код, с радост ще го публикувам някъде. Засега ето кодов фрагмент, който да ви помогне, ако се опитвате да направите същото:

// 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 Това е приложение на Megaphone, което просто отеква извежда всичко, което чува в високоговорителя. Но бъдете предупредени, няма акустично анулиране на ехото, така че ще ехти като луд, ако микрофонът успее да улови изхода на високоговорителя. - person Nico; 03.05.2013
comment
Благодаря много, сър. Ще си поиграя с него по-късно, за да видя колко е близо до това, към което се стремя. Надявах се да обединя входа от микрофона с възпроизвеждането на музика, така че ако слушам слушалки, докато шофирам (единствената звукова система, която имам :/), мога да уловя повече фонов шум. Някак си се съмнявам, че микрофонът работи като нормален Windows, където можете просто да прегледате входа на микрофона и да получите същия ефект, защото не е като да записвам микрофона. Мисля, че ще ме сближиш много и за това ти благодаря. - person w0rd-driven; 10.05.2013
comment
Желая ви успех в начинанията, уведомете ме, ако имате нужда от помощ. - person Nico; 10.05.2013

Нико

Когато изпробвах вашия проект MegaPhone, срещнах следната грешка „Препратката към обект не е зададена на екземпляр на обект.“. може ли да погледнеш Благодаря

в MS.Internal.XcpImports.CheckHResult(UInt32 hr) в MS.Internal.XcpImports.MediaStreamSource_OnGetSampleCompleted(MediaElement mediaElement, Int32 streamIndex, StreamInteropWrapper streamWrapper, InternalStreamWrapper internalStream, Int64 offset, Int64 count, Int64 timeInHundredNanoseconds, Int64 durationInHundredNanoseconds, Int32 attributeCount, Int32[ ] attributeLengths, StringBuilder атрибути) в System.Windows.Controls.MediaElement.MediaSourceReportGetSampleCompleted(MediaStreamSample mediaStreamSample) в System.Windows.Media.MediaStreamSource.ReportGetSampleCompleted(MediaStreamSample mediaStreamSample) в Megaphone.MicrophoneSource.microphone_Bu fferReady(Object sender, EventArgs e) в Microsoft. Xna.Framework.Audio.Microphone.OnBufferReady(EventArgs args) в Microsoft.Xna.Framework.Audio.MicrophoneCollection.OnBufferReady(UInt32 манипулатор) в Microsoft.Xna.Framework.FrameworkDispatcher.Update() в Megaphone.MainPage.dt_Tick(Object sender , EventArgs e)

person peanut    schedule 27.01.2014