为什么MediaElement没有播放MediaStreamSource(在SilverLight中)?

时间:2011-11-12 11:26:38

标签: c# silverlight silverlight-4.0 mediaelement mediastreamsource

当我尝试从麦克风传输声音时,我需要通过MediaStreamSource获取声音。 因此,我首先需要为我从麦克风中获取的pcm waveformat实现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至少应调用GetSampleAsync()的方法MediaStreamSource。但事实并非如此。我注意到MediaElement不再对MediaStreamSource进行任何调用。

虽然OpenMediaAsync mediaElement.CurrentStateOpening。之后它转向Playing但它没有播放。然后它不再改变并保持Playing

任何想法?

3 个答案:

答案 0 :(得分:2)

要了解这一点,您需要检查MediaElement.CurrentState - 它会告诉您与MediaStreamSource MediaElement的互动卡在哪一步。这反过来会告诉您哪种MediaStreamSource方法应该以不同方式强制执行......

有关缓冲部分的基本信息的全面演练,请参阅http://msdn.microsoft.com/en-us/library/hh180779%28v=vs.95%29.aspx

答案 1 :(得分:2)

有些事要尝试......

尝试将CanSeek设置为“0”并尝试大于零的持续时间,任何硬编码值都可以,至少尝试使其工作。还要仔细检查你的CodecPrivateData字符串并确保它是正确的。

您也可以尝试从ManagedMediaHelpers project中删除Mp3MediaStreamSource并首先使其工作,以确保您的应用中的其他所有内容都已正确设置,然后切换回您的自定义MediaStreamSource。

答案 2 :(得分: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);
    }