【发布时间】:2011-11-12 11:26:38
【问题描述】:
当我尝试从我的麦克风传输声音时,我需要通过MediaStreamSource 获取它。
因此,我首先需要为从麦克风获得的 pcm 波形实现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 16Bits 8kHz)。通过将源设置为此处调用此方法:
WaveMediaStreamSource WaveStream = new WaveMediaStreamSource(output);
mediaElement.SetSource(WaveStream);
mediaElement.Play();
Play() 之后绝对没有任何反应。我建议 mediaElement 应该至少调用一次 MediaStreamSource 的方法 GetSampleAsync()。但事实并非如此。我注意到MediaElement 不再调用MediaStreamSource。
虽然OpenMediaAsync mediaElement.CurrentState 是Opening。之后它转到Playing,但它不播放。然后它不再改变,仍然是Playing。
有什么想法吗?
【问题讨论】:
-
我也看过this example。它的实现非常相似,并且对于上面的这部分几乎相同。 (持续时间部分除外)唯一不同的是,它似乎每隔几毫秒切换一次
MediaStreamSource。但这不应该影响GetSampleAsync()永远不会被调用。我追踪的其余部分产生了完全相同的数据。 -
对于这个例子,我也能够重现这种行为,当我只分配一个
MediaStreamSource并阻止所有后续操作时,它也永远不会触及流的GetSampleAsync()-Method。这闻起来像缓冲或类似的东西,“直到”分配了特定数量的MediaStreamSource-objects。但这对我来说绝对没有意义——或者我不明白。有人有想法吗?
标签: c# silverlight silverlight-4.0 mediaelement mediastreamsource