public void WriteNewFile() { byte[] ZERO = new byte[10]; for (int z = 0; z < Slices.Count; z++) { var jumpTable = JumpTables[z]; var slice = Slices[z]; var span = slice.Span; var path = Path.Combine(FileInfo.DirectoryName, Path.GetFileNameWithoutExtension(FileInfo.FullName) + "_fixed_" + z + ".flv"); using (var write = new FileStream(path, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None)) { write.Write(FLVSTART, 0, 13); { // 写 script tag var script = span[0]; var metabytes = new byte[script.TagSize]; Input.Seek(script.Position + 11, SeekOrigin.Begin); Input.Read(metabytes, 0, metabytes.Length); var meta = new FlvMetadata(metabytes); var writemetabytes = meta.ToBytes(); write.WriteByte((byte)script.TagType); var size = BitConverter.GetBytes(writemetabytes.Length).ToBE(); write.Write(size, 1, 3); write.Write(ZERO, 0, 3 + 1 + 3); write.Write(writemetabytes, 0, writemetabytes.Length); write.Write(BitConverter.GetBytes(11 + writemetabytes.Length).ToBE(), 0, 4); } int offset = span[1].TimeStamp; int lastTimestamp = 0; for (int i = 1; i < span.Length; i++) { Input.Seek(span[i].Position, SeekOrigin.Begin); Input.CopyBytes(write, 4); Input.Seek(4, SeekOrigin.Current); if (!span[i].Flag.HasFlag(TagFlag.SameAsLastTimestamp)) { if (jumpTable.ContainsKey(span[i].Position)) { offset -= jumpTable[span[i].Position]; } lastTimestamp = span[i].TimeStamp - offset; } byte[] timing = BitConverter.GetBytes(lastTimestamp).ToBE(); write.Write(timing, 1, 3); write.WriteByte(timing[0]); Input.CopyBytes(write, 3 + span[i].TagSize + 4); } write.Seek(49, SeekOrigin.Begin); write.Write(BitConverter.GetBytes(lastTimestamp / 1000d).ToBE(), 0, sizeof(double)); } } }