Exemplo n.º 1
0
        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));
                }
            }
        }