Пример #1
0
        public void ExecuteBlack(double rate, double time, string outputfilename)
        {
            if (_parser == null)
            {
                return;
            }

            double o_rate = _parser.Rate;

            if (o_rate < rate)
            {
                // 不需要转换
                //此视频不需要转换 后黑

                return;
            }
            long   filesize = _parser.Length + 16;
            double duration;

            if (time < 0)
            {
                // 计算傲娇时间
                duration = filesize / 125.0 / rate; // * 8 / 1000 / rate
            }
            else
            {
                duration = _parser.Duration / 1000.0 + time;
            }
            string offset = ((duration * 1000 - _parser.Duration) / 1000).ToString("0.000");

            //开始处理后黑

            Stream src  = new FileStream(_filename, FileMode.Open);
            string path = outputfilename;

            Stream dest = new FileStream(path, FileMode.Create);

            WriteHead(dest, filesize, duration, -1, -1, -1, 1.0, 0,
                      0, _parser.Tags.Count - 1, false);
            for (int i = 1; i < _parser.Tags.Count; i++)
            {
                src.Seek(_parser.Tags[i].Offset - 11, SeekOrigin.Begin);
                FlvParser.FlvTag tag = _parser.Tags[i];
                byte[]           bs  = new byte[tag.DataSize + 11];
                // 数据
                src.Read(bs, 0, bs.Length);
                dest.Write(bs, 0, bs.Length);
                // prev tag size
                src.Read(bs, 0, 4);
                dest.Write(bs, 0, 4);
            }
            src.Close();
            src.Dispose();
            byte[] buffer = new byte[] {
                0x09, 0, 0, 0x01,     // 视频帧 1 字节
                0, 0, 0, 0,           // 04h, timestamp & ex
                0, 0, 0,              // stream id
                0x17,                 // InnerFrame, H.264
                0, 0, 0, 0x0c         // 此帧长度 12 字节
            };
            uint dur = (uint)(duration * 1000);

            PutTime(buffer, 0x04, dur);
            dest.Write(buffer, 0, buffer.Length);

            dest.Flush();
            dest.Close();
            dest.Dispose();
        }
Пример #2
0
        public void ExecuteTime(double rate, double time, string outputfilename)
        {
            if (_parser == null)
            {
                return;
            }
            double o_rate = _parser.Rate;

            if (o_rate < rate)
            {
                // 不需要转换
                return;
            }

            long filesize = _parser.Length;

            if (rate < 0)
            {
                filesize += 27;
            }
            uint   offset;
            double duration;

            if (time < 0)
            {
                // 计算傲娇时间
                duration = filesize / 125.0 / rate; // * 8 / 1000 / rate
                offset   = (uint)(duration * 1000 - _parser.Duration);
                //o_rate = rate;
            }
            else
            {
                duration = _parser.Duration / 1000.0 + time;
                offset   = (uint)(time * 1000);
                //o_rate = filesize / 125.0 / duration;
            }
            string offstr = (offset / 1000.0).ToString("0.000");
            //开始处理傲娇

            Stream src = new FileStream(_filename, FileMode.Open);

            string path = outputfilename;

            Stream dest = new FileStream(path, FileMode.Create);

            WriteHead(dest, filesize, duration, 2.0, 2.0, -1, 1.0, 0 - offset,
                      0, _parser.Tags.Count - 1, (rate < 0));
            // 傲娇的话才插入新帧
            if (rate < 0)
            {
                ushort width = 512, height = 384;
                //try
                //{
                //    string[] ss = toolComboFrame.Text.Split('x');
                //    if (ss.Length == 2)
                //    {
                //        width = ushort.Parse(ss[0]);
                //        height = ushort.Parse(ss[1]);
                //    }
                //}
                //catch { }
                byte[] buffer = GetH263Frame(0, width, height);
                dest.Write(buffer, 0, buffer.Length);
            }

            //WriteDataStream(src, parser.Tags[1].Offset - 11, dest);
            bool flag = true;

            for (int i = 1; i < _parser.Tags.Count; i++)
            {
                src.Seek(_parser.Tags[i].Offset - 11, SeekOrigin.Begin);
                FlvParser.FlvTag tag = _parser.Tags[i];
                byte[]           bs  = new byte[tag.DataSize < 4 ? 4 : tag.DataSize];
                src.Read(bs, 0, 4);
                dest.Write(bs, 0, 4);
                // 时间戳
                uint t = tag.TimeStamp;
                if (flag)
                {
                    FlvParser.VideoTag vtag = tag as FlvParser.VideoTag;
                    if (time < 0)
                    {
                        // 无傲娇进度条
                        if ((vtag != null) && (vtag.AVCPacketType == 1))
                        {
                            t   += offset;
                            flag = false;
                        }
                        else
                        {
                            t = 0;
                        }
                    }
                    else
                    {
                        // 傲娇
                        if (vtag != null)
                        {
                            if (vtag.FrameType == "keyframe")
                            {
                                flag = false;
                            }
                            t = 0;
                        }
                        else
                        {
                            t += offset;
                        }
                    }
                }
                else
                {
                    t += offset;
                }
                PutTime(bs, 0, t);
                dest.Write(bs, 0, 4); // timestamp
                // 继续的数据
                src.Seek(4, SeekOrigin.Current);
                src.Read(bs, 0, 3); // streamid
                dest.Write(bs, 0, 3);
                src.Read(bs, 0, tag.DataSize);
                dest.Write(bs, 0, tag.DataSize);
                // prev tag size
                src.Read(bs, 0, 4);
                dest.Write(bs, 0, 4);
            }
            src.Close();
            src.Dispose();
            dest.Flush();
            dest.Close();
            dest.Dispose();
        }