2

私のマイクからサウンドをストリーミングしようとすると、MediaStreamSourceを取得する必要があります。 したがって、まずマイクから取得したpcm波形にMediaStreamSourceを実装する必要があります。私が実装する必要があると思う少なくとも2つの方法があります。最初はMediaElementが(SilverLightの)MediaStreamSourceを再生しないのはなぜですか?

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 16ビット8kHz)です。この方法は、ここでは、ソースを設定することにより呼び出される:

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

Play() absoultely何も起こりません後。 mediaElementは少なくとものMediaStreamSourceというメソッドを一度呼び出す必要があります。しかし、それはしません。私はMediaElementがもうMediaStreamSourceへの呼び出しを行わないことに気付きました。

OpenMediaAsyncmediaElement.CurrentStateは、Openingである。その後、それはPlayingに変わりますが、再生されません。そしてそれはもはや変わらず、残りはPlayingです。

すべてのアイデア?

+0

また、[この例](http://silverlightvideochat.codeplex.com/releases/view/43242)も見てきました。これは非常に似通って実装されており、この部分はほぼ同じです。 (duration部分を除いて)違いは唯一のもので、数ミリ秒ごとに 'MediaStreamSource'を切り替えるようです。しかし、これは 'GetSampleAsync()'が決して呼び出されないことに影響するべきではありません。私がトレースした残りの部分は正確に同じデータを生成します。 –

+0

この例では、この動作を再現することもできます.1つの 'MediaStreamSource'を割り当て、それ以降をすべてブロックすると、ストリームの' GetSampleAsync() 'メソッドには決して触れません。これはバッファリングのような臭いがします。つまり、 'MediaStreamSource'オブジェクトの特定の数が割り当てられるまで' until 'です。しかし、これは私にとって全く意味をなさない - あるいは私はそれを理解していない。誰かアイデア? –

答えて

2

MediaElement.CurrentStateを確認する必要があります。MediaStreamSourceMediaElementとの対話のどのステップが停止しているかを確認する必要があります。これは、順番に... ...異なっimpementedする必要がありますあなたのMediaStreamSource方法のどの

てみてくださいバッファリング部に不可欠な情報試してhttp://msdn.microsoft.com/en-us/library/hh180779%28v=vs.95%29.aspx

+0

はい私はすでにそれについて考えており、私はそのリンクを知っています。しかし、私のmediaElementはそれが '遊んでいる 'と私に伝えています。それは 'Opening'から' Playing'に変わり、もう何も起こりません。 (私は手動で、そして、 'CurrentStateChanged'イベントを介してそれをチェックします。) –

+0

@nemcijaこのリンクは、MediaElementが「飢えている」ケースを持っている場合に起こりますIMO。 – Yahia

+0

しかし、それが決して要求されないとき、mediaElementにBufferStateについてどのように伝えるべきですか?私は 'ReportOpenMediaCompleted'を報告した直後に' ReportGetSampleProgress(1); 'で報告しようとしました。しかし、それは違いはありません。私も 'this.AudioBufferLength'で遊んでいます。私が 'mediaElement.BufferingProgress'を尋ねると、それは満たされていると私に伝えます。 –

2

いくつかのものを参照してくださいを含む総合的なウォークスルーについては

を教えてくれますCanSeekを "0"に設定して0より大きい時間を試してください。ハードコーディングされた値は、少なくとも動作させるためには問題ありません。また、CodecPrivateData文字列を再度確認し、正しいことを確認してください。

ManagedMediaHelpers projectからMp3MediaStreamSourceを削除して、まずアプリケーションのその他のものがすべて正しく設定されていることを確認してから、カスタムMediaStreamSourceに戻すこともできます。

+0

私はすでにそのすべてをやっています。 chatprotocolで読むことができるように、私は既にさまざまな 'MediaStreamSource'実装(&projects)を成功させていませんでした。現在、私はバグのように思えるので、シルバーライトを落とす国にいる。ときにはうまくいく - 時にはそうではない - ほとんどではない。 –

1

Windows Phone用のmediaElement(WP7.5およびWP8)を開発すると、私を完全に超えている理由から、コールバックが初めて呼び出されたときに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); 
    } 
+0

Silverlight5 VS2012と同じ動作 – tpol

関連する問題