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); } }
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"); } }); }
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); }