【问题标题】:Why is the MediaElement not playing a MediaStreamSource (in SilverLight)?为什么 MediaElement 不播放 MediaStreamSource(在 SilverLight 中)?
【发布时间】: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.CurrentStateOpening。之后它转到Playing,但它不播放。然后它不再改变,仍然是Playing

有什么想法吗?

【问题讨论】:

  • 我也看过this example。它的实现非常相似,并且对于上面的这部分几乎相同。 (持续时间部分除外)唯一不同的是,它似乎每隔几毫秒切换一次MediaStreamSource。但这不应该影响GetSampleAsync() 永远不会被调用。我追踪的其余部分产生了完全相同的数据。
  • 对于这个例子,我也能够重现这种行为,当我只分配一个MediaStreamSource 并阻止所有后续操作时,它也永远不会触及流的GetSampleAsync()-Method。这闻起来像缓冲或类似的东西,“直到”分配了特定数量的MediaStreamSource-objects。但这对我来说绝对没有意义——或者我不明白。有人有想法吗?

标签: c# silverlight silverlight-4.0 mediaelement mediastreamsource


【解决方案1】:

要了解这一点,您需要检查MediaElement.CurrentState - 它会告诉您与MediaStreamSource 交互的哪个步骤@ 987654327@ 卡住了。这反过来会告诉您应该以不同的方式执行您的 MediaStreamSource 方法...

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

【讨论】:

  • 是的,我已经考虑过了,我知道那个链接。但我的 mediaElement 告诉我它是Playing。它从Opening 变为Playing,然后什么也没有发生。 (我通过CurrentStateChanged-Event 手动检查。)
  • @nemcija 如果您阅读该链接到底部,您会发现当 MediaElement 出现“饥饿”情况时会发生这种行为 - 您的描述与 IMO 一致。
  • 但是当它从不要求它时,我应该如何告诉 mediaElement BufferState 呢?我尝试在举报ReportOpenMediaCompleted 后直接通过ReportGetSampleProgress(1); 举报。但这并没有什么不同。我也玩过this.AudioBufferLength。如果我问mediaElement.BufferingProgress,它会告诉我它已满。
  • @nemcija 因为我没有你的情况,我只能建议实施LogReady 事件(msdn.microsoft.com/en-us/library/…)然后调用RequestLogmsdn.microsoft.com/en-us/library/…)看看它报告了什么- 它可能缺少提示...
  • 好的。我有我的答案:对我来说,这意味着 silverlight 是错误的(至少在某些系统上是这样),我将不再浪费时间来研究 silverlight。跨度>
【解决方案2】:

尝试一些事情......

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

您可能还想尝试从 ManagedMediaHelpers project 中放入 Mp3MediaStreamSource 并首先使其正常工作,以确保您应用中的所有其他内容均已正确设置,然后切换回您的自定义 MediaStreamSource。

【讨论】:

  • 我已经完成了所有这些。正如您在聊天协议中看到的那样,我已经尝试了不同的MediaStreamSource 实现(和项目)但没有成功。目前我处于放弃silverlight的状态,因为它似乎有问题。有时它有效 - 有时无效 - 大多无效。
【解决方案3】:

在为 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);
    }

【讨论】:

  • 与 Silverlight5 VS2012 的行为相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
相关资源
最近更新 更多