public void FinallizeFile() { try { if (!Directory.Exists(Path.GetDirectoryName(this.path))) { Directory.CreateDirectory(Path.GetDirectoryName(this.path)); } using (var fs = new FileStream(this.path, FileMode.CreateNew, FileAccess.ReadWrite)) { fs.Write(FlvStreamProcessor.FLV_HEADER_BYTES, 0, FlvStreamProcessor.FLV_HEADER_BYTES.Length); fs.Write(new byte[] { 0, 0, 0, 0, }, 0, 4); double clipDuration = (this.Tags[this.Tags.Count - 1].TimeStamp - this.Tags[0].TimeStamp) / 1000d; this.Header["duration"] = clipDuration; this.Header["lasttimestamp"] = (double)(this.Tags[this.Tags.Count - 1].TimeStamp - this.Tags[0].TimeStamp); var t = this.funcFlvTag(); t.TagType = TagType.DATA; if (this.Header.ContainsKey("BililiveRecorder")) { // TODO: 更好的写法 (this.Header["BililiveRecorder"] as Dictionary <string, object>)["starttime"] = DateTime.UtcNow - TimeSpan.FromSeconds(clipDuration); } t.Data = this.Header.ToBytes(); t.WriteTo(fs); int offset = this.Tags[0].TimeStamp; this.HTags.ForEach(tag => tag.WriteTo(fs)); this.Tags.ForEach(tag => tag.WriteTo(fs, offset)); logger.Info("剪辑已保存:{0}", Path.GetFileName(this.path)); fs.Close(); } this.Tags.Clear(); } catch (IOException ex) { logger.Warn(ex, "保存剪辑文件时出错"); } catch (Exception ex) { logger.Error(ex, "保存剪辑文件时出错"); } ClipFinalized?.Invoke(this, new ClipFinalizedArgs() { ClipProcessor = this }); }
public void FinallizeFile() { try { if (!Directory.Exists(Path.GetDirectoryName(path))) { Directory.CreateDirectory(Path.GetDirectoryName(path)); } using (var fs = new FileStream(path, FileMode.CreateNew, FileAccess.ReadWrite)) { fs.Write(FlvStreamProcessor.FLV_HEADER_BYTES, 0, FlvStreamProcessor.FLV_HEADER_BYTES.Length); fs.Write(new byte[] { 0, 0, 0, 0, }, 0, 4); Header.Meta["duration"] = (Tags[Tags.Count - 1].TimeStamp - Tags[0].TimeStamp) / 1000d; Header.Meta["lasttimestamp"] = (Tags[Tags.Count - 1].TimeStamp - Tags[0].TimeStamp); var t = new FlvTag { TagType = TagType.DATA, Data = Header.ToBytes() }; t.WriteTo(fs); int offset = Tags[0].TimeStamp; HTags.ForEach(tag => tag.WriteTo(fs)); Tags.ForEach(tag => tag.WriteTo(fs, offset)); logger.Info("剪辑已保存:{0}", Path.GetFileName(path)); fs.Close(); } Tags.Clear(); } catch (Exception ex) { logger.Error(ex, "保存剪辑文件时出错"); } ClipFinalized?.Invoke(this, new ClipFinalizedArgs() { ClipProcessor = this }); }