2

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

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

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

我可以连续播放 500 毫秒或更短的 SoundEffects 来实现我的目标,但我想知道是否有更复杂的方法涉及麦克风不断写入 MemoryStream,音频播放控件可以连续读取。

感谢您的任何帮助!

4

2 回答 2

2

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

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

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

基本上,只要返回麦克风缓冲区,您就可以报告样本已准备就绪。这导致流畅的播放。

于 2013-03-07T03:36:49.253 回答
0

尼科

在尝试您的 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 属性[ ] 属性长度,StringBuilder 属性)在 System.Windows.Controls.MediaElement.MediaSourceReportGetSampleCompleted(MediaStreamSample mediaStreamSample) 在 System.Windows.Media.MediaStreamSource.ReportGetSampleCompleted(MediaStreamSample mediaStreamSample) 在 Microsoft 的 Megaphone.MicrophoneSource.microphone_BufferReady(Object sender, EventArgs e)。 Microsoft.Xna.Framework.Audio.MicrophoneCollection 上的 Xna.Framework.Audio.Microphone.OnBufferReady(EventArgs args)。Microsoft.Xna.Framework.FrameworkDispatcher.Update() 处的 OnBufferReady(UInt32 句柄) Megaphone.MainPage.dt_Tick(Object sender, EventArgs e)

于 2014-01-27T00:03:18.080 回答