当我尝试从麦克风中流式传输声音时,我需要通过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‘(PCM1ch 16Bits 8 8kHz)。通过将源设置为如下所示来调用此方法:
WaveMediaStreamSource WaveStream = new WaveMediaStreamSource(output);
mediaElement.SetSource(WaveStream);
mediaElement.Play(); 在Play()之后,什么也没有发生。我建议mediaElement至少应该调用一次MediaStreamSource的GetSampleAsync()方法。但事实并非如此,我注意到MediaElement不再调用MediaStreamSource了。
而OpenMediaAsync的mediaElement.CurrentState是Opening。之后,它会转到Playing,但它不会播放。然后它就不再改变了,仍然是Playing。
有什么想法吗?
发布于 2011-11-14 23:45:01
要弄清楚这一点,你需要检查MediaElement.CurrentState -它会告诉你在与MediaStreamSource交互的哪一步,MediaElement被卡住了。这反过来将告诉您哪些MediaStreamSource方法应该以不同的方式实现……
有关包含有关缓冲部分的基本信息的全面演练,请参见http://msdn.microsoft.com/en-us/library/hh180779%28v=vs.95%29.aspx
发布于 2011-11-18 23:45:30
一些可以尝试的东西。
尝试将CanSeek设置为"0“,并尝试一个大于零的持续时间,任何硬编码的值都可以,至少可以尝试让它工作。还要仔细检查你的CodecPrivateData字符串,确保它是正确的。
您可能还想尝试从ManagedMediaHelpers project中删除Mp3MediaStreamSource,并首先让它工作,以确保您的应用程序中的其他所有内容都设置正确,然后切换回您的自定义MediaStreamSource。
发布于 2012-12-01 16:04:11
在为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);
}https://stackoverflow.com/questions/8104147
复制相似问题