2

マイクからサウンドをストリーミングしようとするときは、MediaStreamSource. したがって、最初MediaStreamSourceにマイクから取得した pcm 波形を実装する必要があります。実装する必要があると思われる方法が少なくとも 2 つあります。初めに

protected override void OpenMediaAsync() {
   // Create description
   Dictionary<MediaStreamAttributeKeys, string> streamAttributes = new Dictionary<MediaStreamAttributeKeys, string>();
   streamAttributes[MediaStreamAttributeKeys.CodecPrivateData] = output.CodecPrivateData;
   audioDesc = new MediaStreamDescription(MediaStreamType.Audio, streamAttributes);

   // register stream
   Dictionary<MediaSourceAttributesKeys, string> sourceAttributes = new Dictionary<MediaSourceAttributesKeys, string>();
   List<MediaStreamDescription> availableStreams = new List<MediaStreamDescription>();

   availableStreams.Add(audioDesc);
   sourceAttributes[MediaSourceAttributesKeys.Duration] = TimeSpan.FromMinutes(0).Ticks.ToString(); // whatever I put here I get the same result.
   sourceAttributes[MediaSourceAttributesKeys.CanSeek] = false.ToString();

   ReportOpenMediaCompleted(sourceAttributes, availableStreams);
}

これは非常にうまく機能します。私の CodecPrivateData は '01000100401F0000803E0000020010000000' (PCM 1ch 16Bits 8kHz) です。このメソッドは、ソースを次のように設定することで呼び出されます。

WaveMediaStreamSource WaveStream = new WaveMediaStreamSource(output);
mediaElement.SetSource(WaveStream);
mediaElement.Play(); 

Play()絶対に何も起こらない後。mediaElement は少なくとも 1 回は のメソッドGetSampleAsync()を呼び出す必要があることをお勧めしMediaStreamSourceます。しかし、そうではありません。MediaElementが をもう呼び出していないことに気付きましたMediaStreamSource

ながら。OpenMediaAsync_ mediaElement.CurrentState_ Openingその後、 に変わりますがPlaying、再生されません。そして、それはもう変わらずに残っていPlayingます。

何か案は?

4

3 に答える 3

2

この問題の根底にたどり着くには、チェックする必要がありMediaElement.CurrentStateます。これにより、どのメソッドを異なる方法で実装する必要があるかがわかります...MediaStreamSourceMediaElementMediaStreamSource

バッファリング部分に関する重要な情報を含む包括的なチュートリアルについては、http://msdn.microsoft.com/en-us/library/hh180779%28v=vs.95%29.aspxを参照してください。

于 2011-11-14T15:45:00.500 に答える
2

試してみるいくつかのこと...

CanSeek を「0」に設定し、ゼロより大きい期間を試してみてください。ハードコードされた値は、少なくとも機能させるためには問題ありません。また、CodecPrivateData 文字列を再確認し、正しいことを確認してください。

また、 ManagedMediaHelpers プロジェクトから Mp3MediaStreamSource をドロップしてみて、アプリ内の他のすべてが適切に設定されていることを確認してから、カスタム MediaStreamSource に切り替えることもできます。

于 2011-11-18T15:45:29.727 に答える
1

Windows Phone (WP7.5 および WP8) 用の mediaElement を開発するとき、理由はまったくわかりませんが、GetSampleAsync コールバックが最初に呼び出されたときに、デバッガーはブレークポイントで中断しません。

デバッガーは、次にブレークポイントに到達したときにブレークします。GetSampleAsync を次のように置き換えてみてください。

protected override void GetSampleAsync(MediaStreamType mediaStreamType)
    {
        System.Diagnostics.Debug.WriteLine("Yay!");

        MediaStreamSample msSamp = new MediaStreamSample(
          _videoDesc, _frameStream, _frameStreamOffset,
          _frameBufferSize, _currentTime, _emptySampleDict);

        ReportGetSampleCompleted(msSamp);
    }
于 2012-12-01T08:04:11.077 に答える