public delegate void CaptureWorkerDelegate(BitmapFrame frame, object state);
public static void CaptureScreenAsync(Uri source, TimeSpan timeSpan, object state,
CaptureWorkerDelegate finalWorkerPrimary)
{
CaptureScreenAsync(source, timeSpan, -1,
state, finalWorkerPrimary, null);
}
public static void CaptureScreenAsync(Uri source, TimeSpan timeSpan, double scale, object state,
CaptureWorkerDelegate finalWorkerPrimary, CaptureWorkerDelegate finalWorkerThumbnail)
{
ThreadPool.QueueUserWorkItem(
delegate { CaptureScreen(source, timeSpan, scale,
state, finalWorkerPrimary, finalWorkerThumbnail); });
}
public static void CaptureScreen(Uri source, TimeSpan timeSpan, object state,
CaptureWorkerDelegate finalWorkerPrimary)
{
CaptureScreen(source, timeSpan, -1, state,
finalWorkerPrimary, null);
}
public static void CaptureScreen(Uri source, TimeSpan timeSpan, double scale, object state,
CaptureWorkerDelegate finalWorkerPrimary, CaptureWorkerDelegate finalWorkerThumbnail)
{
var player = new MediaPlayer { Volume = 0, ScrubbingEnabled = true };
player.Open(source);
player.Pause();
player.Position = timeSpan;
Thread.Sleep(1000);
var width = player.NaturalVideoWidth;
var height = player.NaturalVideoHeight;
var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
var dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen())
dc.DrawVideo(player, new Rect(0, 0, width, height));
rtb.Render(dv);
var frame = BitmapFrame.Create(rtb).GetCurrentValueAsFrozen();
if (finalWorkerPrimary != null)
finalWorkerPrimary(frame as BitmapFrame, state);
if (scale > 0 && finalWorkerThumbnail != null)
{
var thumbnailFrame = BitmapFrame.Create(
new TransformedBitmap(frame as BitmapSource,
new ScaleTransform(scale, scale))).GetCurrentValueAsFrozen();
var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(thumbnailFrame as BitmapFrame);
finalWorkerThumbnail(thumbnailFrame as BitmapFrame, state);
}
player.Close();
}
In the form’s code behind, here is my code. This is just a sample of what can be used.
private delegate void setImageDelegate(string controlName, BitmapFrame frame);
private void setImage(string controlName, BitmapFrame frame)
{
var control = FindName(controlName);
if (control != null)
((Image)control).Source = frame;
}
private void makeThumbnails(BitmapFrame frame, object state)
{
Dispatcher.Invoke(new setImageDelegate(setImage), (string)state, frame);
}
private void makeJpeg(BitmapFrame frame, object state)
{
var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(frame);
string filename = (string)state + ".jpg";
using (var fs = new FileStream(filename, FileMode.Create))
encoder.Save(fs);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var source = video.Source;
VideoScreenShot.CaptureScreenAsync(source, TimeSpan.FromSeconds(10), .1,
"image0", makeJpeg, makeThumbnails);
VideoScreenShot.CaptureScreenAsync(source, TimeSpan.FromSeconds(43) + TimeSpan.FromMilliseconds(760),
"image1", makeThumbnails);
}