2

スピーカーか 3.5 mm ジャックかに関係なく、マイクからデフォルトのオーディオ出力メディアに直接オーディオをストリーミングしようとしています。

オーディオを再生するために私が見つけたメカニズムは、次のように、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

この問題を解決するために、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));
}

基本的には、マイク バッファーが返されるたびに、サンプルの準備ができていることを報告するだけです。これにより、スムーズな再生が実現します。

于 2013-03-07T03:36:49.253 に答える
0

ニコ

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 attributeCount] Microsoft. Microsoft.Xna.Framework.Audio.MicrophoneCollection の Xna.Framework.Audio.Microphone.OnBufferReady(EventArgs args)。Megaphone.MainPage.dt_Tick (オブジェクトの送信者、EventArgs e) の Microsoft.Xna.Framework.FrameworkDispatcher.Update() で OnBufferReady (UInt32 ハンドル)

于 2014-01-27T00:03:18.080 に答える