Ejemplo n.º 1
0
 public FlvParse(Stream stream)
 {
     Head = new FlvHead(stream);
     if (Head.Signature != "FLV")
     {
         throw new Exception("格式错误:" + Head.Signature);
     }
     while (true)
     {
         var    PreviousTagSize = stream.ReadUInt32();
         FlvTag flvTag          = FlvTag.createTag(stream);
         if (flvTag == null)
         {
             break;
         }
         var      data = flvTag.LoadTagData(stream);
         VideoTag v    = flvTag as VideoTag;
         if (v != null)
         {
             Videos.Add(v);
         }
         AudioTag a = flvTag as AudioTag;
         if (a != null)
         {
             Audios.Add(a);
         }
         ScriptDataTag d = flvTag as ScriptDataTag;
         if (d != null)
         {
             MediaData = d;
         }
         tags.Add(flvTag);
     }
 }
Ejemplo n.º 2
0
        public FlvReader(Func <Stream> s)
        {
            this.CreateStream = s;

            Stream stream = this.CreateStream(); // new HttpStream(url);
            var    Head   = new FlvHead(stream); //9

            if (Head.Signature != "FLV")
            {
                throw new Exception("格式错误:" + Head.Signature);
            }
            while (FirstAudio == null || FirstVideo == null || MediaData == null)
            {
                this.readPreviousTag(stream);
            }


            //加载keyframes
            Task.Run(() => {
                double nxf = 0;
                double off = MediaData.Duration / 250;


                var obj = MediaData["keyframes"]?.GetObject();
                if (obj != null)
                {
                    times = obj["times"].GetArray().Select((d) => d.GetNumber()).ToList();
                    kfs   = obj["filepositions"].GetArray().Select((d) => (long)d.GetNumber()).ToList();
                    Debug.WriteLine("@@@ keyframes:ALL");
                    Debug.WriteLine("@@@ keyframes:ALL");
                }
                else
                {
                    Debug.WriteLine("@@@ keyframes:LOADSTART");
                    while (true)
                    {
                        var PreviousTagSize = stream.ReadUInt32();
                        FlvTag flvTag       = FlvTag.createTag(stream);
                        if (flvTag == null)
                        {
                            break;
                        }
                        var data = flvTag.LoadTagData(stream);
                        //关键帧
                        VideoTag tag = flvTag as VideoTag;
                        if (tag != null)
                        {
                            if (flvTag.TimeSpan.TotalSeconds >= nxf)
                            {
                                nxf += off;
                                times.Add(flvTag.TimeSpan.TotalSeconds);
                                kfs.Add(flvTag.Offset); //PreviousTagSize:4
                            }
                        }
                    }
                    Debug.WriteLine("@@@ keyframes:LOAdEND");
                }
            });
        }
Ejemplo n.º 3
0
        public bool readPreviousTag(Stream stream)
        {
            var p = stream.Position;
            //Debug.WriteLine("readPreviousTag:{0}({0:X})+4+11=>{1}({1:X})", p,p+11+4);
            var    PreviousTagSize = stream.ReadUInt32();      //4    倒置读取位置
            FlvTag flvTag          = FlvTag.createTag(stream); //11   头部

            if (flvTag == null)
            {
                return(false);
            }
            var data = flvTag.LoadTagData(stream);

            //媒体数据
            if (flvTag is ScriptDataTag)
            {
                MediaData = flvTag as ScriptDataTag;
                return(true);
            }

            //音频头帧
            if (flvTag is AudioTag)
            {
                var tag = flvTag as AudioTag;
                if (FirstAudio == null)
                {
                    FirstAudio = tag as AudioTag;
                    return(true);
                }
                AudioCache.Enqueue(tag);
            }

            //视频头帧
            if (flvTag is VideoTag)
            {
                var tag = flvTag as VideoTag;
                if (FirstVideo == null)
                {
                    FirstVideo = flvTag as VideoTag;
                    return(true);
                }

                VideoCache.Enqueue(tag);
            }

            return(true);
        }