如何将音频从麦克风传输到扬声器?

Posted

技术标签:

【中文标题】如何将音频从麦克风传输到扬声器?【英文标题】:How to stream audio from microphone to speaker? 【发布时间】:2013-01-18 19:01:17 【问题描述】:

我希望将音频直接从麦克风流式传输到默认音频输出介质,无论是扬声器还是 3.5 毫米插孔。

我发现播放音频的机制似乎取决于提供静态字节数以在 SoundEffect 中播放,如下所示:

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

我可以持续播放 500 毫秒或更短的 SoundEffect 来实现我的目标,但我想知道是否有更复杂的方法让麦克风持续写入 MemoryStream,音频播放控件可以持续读取该内存流。

感谢您的帮助!

【问题讨论】:

如果您使用主扬声器和麦克风,反馈可能会使这听起来很糟糕。想想一个非常糟糕的扬声器,延迟和啸叫......这就是你想要的效果吗? 我专门针对 3.5 毫米插孔,但我不确定反馈会有多糟糕,所以我将扬声器留在了我的问题中。不过你是对的,我不想要那种效果。 【参考方案1】:

我通过使用麦克风向 MediaElement 播放器提供样本的类扩展 MediaStreamSource 类来解决这个问题。

如果对此代码块有任何需求,我会很乐意将其发布到某个地方。现在,如果您尝试做同样的事情,这里有一个代码 sn-p 可以帮助您:

// 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));

您基本上只是在返回麦克风缓冲区时报告样本已准备就绪。这样可以流畅播放。

【讨论】:

我稍后会玩这个以确保我可以跟随,但我想说我很可能希望看到你的代码示例。我正在考虑进一步了解这一点,我可能需要我能得到的所有帮助。您的扩展 MediaStreamSource 可能正是我开始所需要的。 当然,我为您上传了整个项目:sdrv.ms/16vz7Jb 这是一个扩音器应用程序,它只会在扬声器中听到任何声音。但请注意,没有声学回声消除功能,因此如果麦克风可以拾取扬声器的输出,它会像疯了一样回声。 非常感谢,先生。稍后我会玩它,看看它与我的目标有多接近。我希望将麦克风输入与音乐播放合并,这样如果我在开车时听耳机(我唯一的音响系统:/),我可以拾取更多的背景噪音。我以某种方式怀疑麦克风是否像普通窗口一样工作,您可以在其中预览麦克风输入并获得相同的效果,因为我不需要录制麦克风。我想你会让我非常接近,为此我感谢你。 祝您一切顺利,如果您需要任何帮助,请告诉我。【参考方案2】:

尼哥

在尝试您的 MegaPhone 项目时,我遇到了以下错误“对象引用未设置为对象的实例。”。 你能看看吗?谢谢

在 MS.Internal.XcpImports.CheckHResult(UInt32 小时) 在 MS.Internal.XcpImports.MediaStreamSource_OnGetSampleCompleted(MediaElement mediaElement,Int32 streamIndex,StreamInteropWrapper streamWrapper,InternalStreamWrapper internalStream,Int64 偏移量,Int64 计数,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_BufferReady(对象发送者,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)

【讨论】:

以上是关于如何将音频从麦克风传输到扬声器?的主要内容,如果未能解决你的问题,请参考以下文章

音频单元从麦克风捕获声音,添加混响,然后发送到扬声器

如何通过套接字或框架将音频从 iPhone 的麦克风流式传输到 Mac/PC?

如何防止在同一台电脑上从麦克风到扬声器的回声

iOS8 AVAudioEngine 如何将麦克风输入路由到(底部)扬声器输出?

仅从 iphone 扬声器(不包括麦克风)录制音频输出

将音频输出重定向到线路输入