当我尝试从麦克风传输声音时,我需要通过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.CurrentState
为Opening
。之后它转向Playing
但它没有播放。然后它不再改变并保持Playing
。
任何想法?
答案 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);
}