MediaStreamSource createHttpStream(Stream stream) { var flv = new FlvParse(stream); var audiodesc = flv.Audios[0].CreateAudioDesc(flv.MediaData); var videodesc = flv.Videos[0].CreateVideoDesc(); var c = new MediaStreamSource(audiodesc, videodesc); c.Duration = TimeSpan.FromSeconds(flv.MediaData.Duration); c.CanSeek = true; return(c); }
/// <summary> /// IInputStream:不支持Seek /// Stream 可以 /// IRandomAccessStream 可以 /// </summary> /// <param name="stream"></param> /// <returns></returns> MediaStreamSource createMediaStream(Stream stream) { var flv = new FlvParse(stream); var audiodesc = flv.Audios[0].CreateAudioDesc(flv.MediaData); var videodesc = flv.Videos[0].CreateVideoDesc(); var c = new MediaStreamSource(audiodesc, videodesc); c.Duration = TimeSpan.FromSeconds(flv.MediaData.Duration); c.CanSeek = true; Debug.WriteLine("-----------------------"); Debug.WriteLine("flv.tags.Count:" + flv.tags.Count); var ai = 1; var at = new TimeSpan(0); var vi = 1; var vt = new TimeSpan(0); c.Starting += (s, e) => { var req = e.Request; Debug.WriteLine("==Starting=="); if ((req.StartPosition != null) && req.StartPosition.Value <= c.Duration) { vi = ai = 1; var time = req.StartPosition.GetValueOrDefault(); foreach (var item in flv.Audios) { if (item.TimeSpan >= time) { Debug.WriteLine(time + " " + ai); break; } ai++; } foreach (var item in flv.Videos) { if (item.TimeSpan >= time) { Debug.WriteLine(time + " " + ai); break; } vi++; } Debug.WriteLine(time + " " + ai); Debug.WriteLine(time + " " + vi); } }; c.SampleRequested += async(s, e) => { var req = e.Request; var deferal = req.GetDeferral(); if (req.StreamDescriptor is AudioStreamDescriptor) { if (flv.Audios.Count > ai) { var flvTag = flv.Audios[ai]; req.Sample = await flvTag.CreateAudioSample(); at = flvTag.TimeSpan; ai++; } } if (req.StreamDescriptor is VideoStreamDescriptor) { if (flv.Videos.Count > vi) { var flvTag = flv.Videos[vi]; //每一段进度条移动距离 req.Sample = await flvTag.CreateVideoSample(flv.Videos[0], true); // vi == 1); vt = flvTag.TimeSpan; vi++; } } deferal.Complete(); }; return(c); }