示例#1
0
        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);
        }
示例#2
0
        /// <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);
        }