当我尝试从麦克风播放声音时,我需要通过MediaStreamSource
。 因此,我首先需要实现一个MediaStreamSource
为我从麦克风获得的pcm波形。至少有两种方法我认为需要实施。起初MediaElement为什么不播放MediaStreamSource(在SilverLight中)?
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()
之后absoultely什么也没有发生。我建议mediaElement应至少调用MediaStreamSource
的方法GetSampleAsync()
。但事实并非如此。我注意到MediaElement
不再拨打任何电话给MediaStreamSource
了。
虽然OpenMediaAsync
mediaElement.CurrentState
是Opening
。之后,它变成Playing
,但它不起作用。然后它不再改变,并保持Playing
。
任何想法?
我也看过[此示例](http://silverlightvideochat.codeplex.com/releases/view/43242)。它的实现非常相似,而且这部分几乎相同。 (除持续时间部分)唯一不同的是,它似乎每隔几毫秒切换一次'MediaStreamSource'。但是这不应该影响'GetSampleAsync()'永远不会被调用。我追踪的其余部分产生完全相同的数据。 –
对于这个例子,我也能够重现这种行为,当我只分配一个'MediaStreamSource'并且阻止所有跟随时,它也不会触及流的'GetSampleAsync()'方法。这听起来像缓冲或类似的东西,'直到'已经分配了特定数量的'MediaStreamSource'对象。但是这对我来说绝对没有意义 - 否则我不明白。任何人的想法? –