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

Windows phone 7 如何将音频从麦克风传输到扬声器?,windows-phone-7,audio,windows-phone-8,windows-phone,microphone,Windows Phone 7,Audio,Windows Phone 8,Windows Phone,Microphone,我希望将音频直接从麦克风传输到默认的音频输出介质,无论是扬声器还是3.5毫米插孔 我发现播放音频的机制似乎取决于在SoundEffect中提供静态字节数,如下所示: SoundEffect sound = new SoundEffect(stream.ToArray(), microphone.SampleRate, AudioChannels.Mono); soundInstance = sound.CreateInstance(); soundIsPlaying = true; soundI

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

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

SoundEffect sound = new SoundEffect(stream.ToArray(), microphone.SampleRate, AudioChannels.Mono);
soundInstance = sound.CreateInstance();
soundIsPlaying = true;
soundInstance.Play();
我可以连续播放500毫秒或更少的音效来实现我的目标,但我想知道是否有一种更复杂的方法可以让麦克风不断地写入记忆流,而音频播放控件可以不断地读取记忆流


谢谢你的帮助

我通过扩展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));
}
基本上,只要在返回麦克风缓冲区时报告样本已准备就绪。这将导致平滑播放。

Nico

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

在MS.Internal.XcpImports.CheckHResult(UInt32小时) 在MS.Internal.XcpImports.MediaStreamSource_OnGetSampleCompleted(MediaElement MediaElement、Int32 streamIndex、StreamInteropWrapper streamWrapper、InternalStreamWrapper internalStream、Int64偏移量、Int64计数、Int64时间inhundredNanoseconds、Int64 durationInHundredNanoseconds、Int32 attributeCount、Int32[]属性长度、StringBuilder属性) 位于System.Windows.Controls.MediaElement.MediaSourceReportGetSampleCompleted(MediaStreamSample MediaStreamSample) 位于System.Windows.Media.MediaStreamSource.ReportGetSampleCompleted(MediaStreamSample MediaStreamSample) 在扩音器处。麦克风源。麦克风缓冲就绪(对象发送器,事件参数e) 位于Microsoft.Xna.Framework.Audio.microscope.OnBufferReady(EventArgs args) 位于Microsoft.Xna.Framework.Audio.MicrophoneCollection.OnBufferReady(UInt32句柄) 在Microsoft.Xna.FrameworkDispatcher.Update()上
在Megaphone.MainPage.dt_Tick(Object sender,EventArgs e)

如果使用主扬声器和麦克风,反馈可能会使声音变得非常糟糕。想一想一个非常糟糕的扬声器,带有延迟和口哨声。。。这就是你想要的效果吗?我专门针对3.5毫米插孔,但我不确定反馈会有多差,所以我把问题留给了演讲者。不过你是对的,我不想要那种效果。我稍后会玩这个,以确保我能跟上,但我想说的是,我很可能希望看到你的代码示例。我正在进一步考虑这一点,我可能需要所有能得到的帮助。您的扩展MediaStreamSource可能正是我需要开始的东西。当然,我在上为您上传了整个项目:它是一个扩音器应用程序,只会呼出扬声器中听到的任何声音。但是请注意,没有回声消除功能,因此如果麦克风能够接收到扬声器的输出,它会发出疯狂的回声。非常感谢,先生。我稍后会玩它,看看它离我的目标有多近。我希望将麦克风输入与音乐播放结合起来,这样如果我在开车时听耳机(我唯一的音响系统:/),我就可以拾取更多的背景噪音。我怀疑麦克风是否能像普通窗口一样工作,在普通窗口中,你可以预览麦克风输入并获得相同的效果,因为我不需要录制麦克风。我想你会离我很近,为此我感谢你。我祝你在努力中好运,如果你需要帮助,请告诉我。