关于作者提到的两个已知问题

Nov 2, 2012 at 3:38 PM

已知问题

  • 视频流最末帧无法呈现;
  • 不会引发 MediaElement 的 MediaEnded 事件。

我已经解决了这两个问题。

感谢原作者的无私奉献!

Mar 10, 2014 at 2:53 AM
cotaku39 wrote:
已知问题 视频流最末帧无法呈现; 不会引发 MediaElement 的 MediaEnded 事件。 我已经解决了这两个问题。 感谢原作者的无私奉献!
请教下,这两个问题是怎么解决的?
Mar 10, 2014 at 4:12 AM
你debug模式运行一下就会发现到视频结束的时候会有exception,处理一下就好。
时间太久,记不太清了,总之很好处理。
Mar 10, 2014 at 5:12 AM
cotaku39 wrote:
你debug模式运行一下就会发现到视频结束的时候会有exception,处理一下就好。
时间太久,记不太清了,总之很好处理。
非常感谢您的回复,我照着您的方法试了下,exception是访问audioSamples数组越界,这个我代码里加了判断,这种情况直接返回null,但是GetSampleAsync里面mediaStreamSample如果是null,就不能ReportGetSampleCompleted。
 protected override void GetSampleAsync(MediaStreamType mediaStreamType)
        {
            MediaStreamSample mediaStreamSample = null;

            if (mediaStreamType == MediaStreamType.Audio)
                mediaStreamSample = this.GetAudioSample();
            else if (mediaStreamType == MediaStreamType.Video)
                mediaStreamSample = this.GetVideoSample();
            if (mediaStreamSample != null)
                this.ReportGetSampleCompleted(mediaStreamSample);
        }

        private MediaStreamSample GetAudioSample()
        {
            MediaStreamSample mediaStreamSample = null;
            if (audioSampleIndex < audioSamples.Count)
            {
                var sample = audioSamples[audioSampleIndex];
                mediaStreamSample = new MediaStreamSample(this.audioStreamDescription, this.mediaStream, sample.Offset, sample.Count, sample.Timestamp,   emptyDict);
                audioSampleIndex++;
                return mediaStreamSample;
            }
            else
                return null;                       
        }     
看了下MSDN

"mediaEnded"
The MediaStreamSource notified the MediaElement that the final samples were delivered for all streams. This is done by reporting special End-of-Stream samples in response to GetSampleAsync.

只是给特殊的samples( special End-of-Stream samples ),meidaStreamSource才会通知MediaElement发生mediaEnded事件,但是这个 special End-of-Stream samples 具体怎么给?
Mar 10, 2014 at 5:39 AM
Edited Mar 10, 2014 at 5:39 AM
Dictionary<MediaSampleAttributeKeys, string> _emptyDict = new Dictionary<MediaSampleAttributeKeys, string>();

mediaStreamSample = new MediaStreamSample(this._videoStreamDescription, null, 0, 0, 0, _emptyDict);
this.ReportGetSampleCompleted(mediaStreamSample);

audio的情况同理
Mar 10, 2014 at 5:57 AM
搞定了,太感谢了!感谢 作者的分享,感谢cokatu耐心的答复!