public CreateVideoStream ( AviWriter writer ) : IAviVideoStream | ||
writer | AviWriter | |
리턴 | IAviVideoStream |
public IAviVideoStream CreateVideoStream(AviWriter writer)
{
// Select encoder type based on FOURCC of codec
if (Codec == KnownFourCCs.Codecs.Uncompressed) return writer.AddUncompressedVideoStream(Width, Height);
else if (Codec == KnownFourCCs.Codecs.MotionJpeg) return writer.AddMotionJpegVideoStream(Width, Height, Quality);
else
{
return writer.AddMpeg4VideoStream(Width, Height, (double)writer.FramesPerSecond,
// It seems that all tested MPEG-4 VfW codecs ignore the quality affecting parameters passed through VfW API
// They only respect the settings from their own configuration dialogs, and Mpeg4VideoEncoder currently has no support for this
quality: Quality,
codec: Codec,
// Most of VfW codecs expect single-threaded use, so we wrap this encoder to special wrapper
// Thus all calls to the encoder (including its instantiation) will be invoked on a single thread although encoding (and writing) is performed asynchronously
forceSingleThreadedAccess: true);
}
}
public IAviAudioStream CreateAudioStream(AviWriter writer)
void RecordScreen() { var buffer = new byte[Params.Width * Params.Height * 4]; var timeTillNextFrame = TimeSpan.Zero; Control.CheckForIllegalCrossThreadCalls = false; bool creatingNewFile = false; while (!closed) { creatingNewFile = false; var startDate = DateTime.Now; using (var writer = Params.CreateAviWriter()) { var frameInterval = TimeSpan.FromSeconds(1 / (double)writer.FramesPerSecond); var videoStream = Params.CreateVideoStream(writer); videoStream.Name = "Captura"; var timedWriter = new TimedFrameWriter(videoStream, writer, Params); while (!stopThread.WaitOne(timeTillNextFrame) && !creatingNewFile) { var timestamp = DateTime.Now; bool captured = Screenshot(buffer); if (captured) { timedWriter.WriteFrame(true, buffer, 0, buffer.Length); } //videoStream.WriteFrame(true, buffer, 0, buffer.Length); timeTillNextFrame = timestamp + frameInterval - DateTime.Now; if (timeTillNextFrame < TimeSpan.Zero) { timeTillNextFrame = TimeSpan.Zero; } if (DateTime.Now.Subtract(startDate).Minutes == 1) { creatingNewFile = true; } } writer.Close(); if (!creatingNewFile) { closed = true; } if (Params.YTUpload) { UploadToYouTube(Params.FileName); Params.FileName = DateTime.Now.ToString("out-yyyy-MM-dd_HH-mm-ss.avi"); } } } }