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