首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么MediaElement不播放MediaStreamSource (在SilverLight中)?

为什么MediaElement不播放MediaStreamSource (在SilverLight中)?
EN

Stack Overflow用户
提问于 2011-11-12 19:26:38
回答 3查看 4.4K关注 0票数 2

当我尝试从麦克风中流式传输声音时,我需要通过MediaStreamSource获取声音。因此,我首先需要为从麦克风获得的pcm波形格式实现一个MediaStreamSource。至少有两个方法我认为我需要实现。一开始

代码语言:javascript
复制
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‘(PCM1ch 16Bits 8 8kHz)。通过将源设置为如下所示来调用此方法:

代码语言:javascript
复制
WaveMediaStreamSource WaveStream = new WaveMediaStreamSource(output);
mediaElement.SetSource(WaveStream);
mediaElement.Play(); 

Play()之后,什么也没有发生。我建议mediaElement至少应该调用一次MediaStreamSourceGetSampleAsync()方法。但事实并非如此,我注意到MediaElement不再调用MediaStreamSource了。

OpenMediaAsyncmediaElement.CurrentStateOpening。之后,它会转到Playing,但它不会播放。然后它就不再改变了,仍然是Playing

有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2011-11-14 23:45:01

要弄清楚这一点,你需要检查MediaElement.CurrentState -它会告诉你在与MediaStreamSource交互的哪一步,MediaElement被卡住了。这反过来将告诉您哪些MediaStreamSource方法应该以不同的方式实现……

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

票数 2
EN

Stack Overflow用户

发布于 2011-11-18 23:45:30

一些可以尝试的东西。

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-12-01 16:04:11

在为Windows Phone (WP7.5和WP8)开发mediaElement时,出于我完全无法理解的原因,调试器不会在GetSampleAsync回调中的任何断点上中断,这是第一次调用回调!

调试器将在下次到达断点时中断。尝试用以下代码替换您的GetSampleAsync:

代码语言:javascript
复制
protected override void GetSampleAsync(MediaStreamType mediaStreamType)
    {
        System.Diagnostics.Debug.WriteLine("Yay!");

        MediaStreamSample msSamp = new MediaStreamSample(
          _videoDesc, _frameStream, _frameStreamOffset,
          _frameBufferSize, _currentTime, _emptySampleDict);

        ReportGetSampleCompleted(msSamp);
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8104147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档