2

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

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对 the 进行任何调用MediaStreamSource

虽然是. OpenMediaAsync_ 之后它会变成但它不播放。然后它不再改变并保持不变。mediaElement.CurrentStateOpeningPlayingPlaying

有任何想法吗?

4

3 回答 3

2

有些东西可以尝试...

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

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

于 2011-11-18T15:45:29.727 回答
2

要深入了解这一点,您需要检查MediaElement.CurrentState- 它会告诉您在与 的交互的哪个步骤MediaStreamSourceMediaElement卡住。这反过来会告诉你哪些MediaStreamSource方法应该以不同的方式实施......

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

于 2011-11-14T15:45:00.500 回答
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);
    }
于 2012-12-01T08:04:11.077 回答