ShareX/ScreenCaptureLib/AVICache.cs
McoreD 503c61cb38 Added FFmpeg recorder support
Screen Recorder tab now has a checkBox: Run CLI afterwards so that you
may execute your favourite Command Line Interface (e.g. x264.exe,
ffmpeg.exe) to encode what has been recorded by ShareX. You may choose
Video for Windows (VfW), FFmpeg or Animated Gif to record your screen.
VfW will allow you to create uncompressed AVI streams or compressed
streams using x264VfW etcc; FFmpeg will allow you to create MPEG4
streams - this is handy if you do not have Administrator access to
install x264VfW to compress your streams. Run CLI afterwards checkBox is
disabled for Animated GIF until we actually see a CLI that could take
GIF and output to a movie file.
2014-05-06 19:23:12 +08:00

102 lines
No EOL
3 KiB
C#

#region License Information (GPL v3)
/*
ShareX - A program that allows you to take screenshots and share any file type
Copyright (C) 2008-2014 ShareX Developers
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Optionally you can also view the license at <http://www.gnu.org/licenses/>.
*/
#endregion License Information (GPL v3)
using HelpersLib;
using System;
using System.Collections.Concurrent;
using System.Drawing;
using System.Threading.Tasks;
namespace ScreenCaptureLib
{
public class AVICache : ImageRecorder
{
private AVIWriter aviWriter;
public AVICache(AVIOptions options)
{
Options = options;
Helpers.CreateDirectoryIfNotExist(Options.OutputPath);
aviWriter = new AVIWriter(Options);
imageQueue = new BlockingCollection<Image>();
}
protected override void StartConsumerThread()
{
if (!IsWorking)
{
IsWorking = true;
task = TaskEx.Run(() =>
{
try
{
position = 0;
while (!imageQueue.IsCompleted)
{
Image img = null;
try
{
img = imageQueue.Take();
if (img != null)
{
//using (new DebugTimer("Frame saved"))
aviWriter.AddFrame((Bitmap)img);
position++;
}
}
catch (InvalidOperationException)
{
}
finally
{
if (img != null) img.Dispose();
}
}
}
finally
{
IsWorking = false;
}
});
}
}
public override void Dispose()
{
if (aviWriter != null)
{
aviWriter.Dispose();
}
base.Dispose();
}
}
}