一、来源
二、优缺点
1、清晰度高
2、占用空间小
3、代码量少、简洁
1、仅支持windows8以上
三、示例代码
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Start.IsEnabled = true;
Pause.IsEnabled = false;
Stop.IsEnabled = false;
}
private System.Timers.Timer _timer;//定时器
private int _secondsElapsed;//录制时间
Recorder _recorder;//核心库
private void Start_Click(object sender, RoutedEventArgs e)
{
try
{
FileResult.Text = "";//文件结果
UpdateProgress();
string timestamp = "GEWorker流程-" + DateTime.Now.ToString("yyyyMMddHHmmss");
string videoPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), timestamp + ".mp4");
_timer = new System.Timers.Timer(1000);
_timer.AutoReset = true;
_timer.Enabled = true;
_timer.Elapsed += new System.Timers.ElapsedEventHandler(delegate
{
_secondsElapsed++;
UpdateProgress();
});
_timer.Start();
if (_recorder == null)
{
_recorder = Recorder.CreateRecorder();
_recorder.OnRecordingComplete += _recorder_OnRecordingComplete;
_recorder.OnRecordingFailed += _recorder_OnRecordingFailed;
_recorder.OnStatusChanged += _recorder_OnStatusChanged;
_recorder.OnSnapshotSaved += _recorder_OnSnapshotSaved;
}
_recorder.Record(videoPath);
_secondsElapsed = 0;
Start.IsEnabled = false;
Pause.IsEnabled = true;
Stop.IsEnabled = true;
}
catch (Exception ex)
{
Start.IsEnabled = true;
Stop.IsEnabled = false;
Pause.IsEnabled = false;
MessageBox.Show(ex.Message);
}
}
private void _recorder_OnSnapshotSaved(object sender, SnapshotSavedEventArgs e)
{
}
private void _recorder_OnStatusChanged(object sender, RecordingStatusEventArgs e)
{
//状态改变
App.Current.Dispatcher.Invoke(delegate {
switch (e.Status)
{
case RecorderStatus.Idle:
FileResult.Text = "请开始录制";
break;
case RecorderStatus.Recording:
Start.IsEnabled = false;
Pause.IsEnabled = true;
Stop.IsEnabled = true;
Pause.Content = "暂停";
break;
case RecorderStatus.Paused:
Start.IsEnabled = false;
Pause.IsEnabled = true;
Stop.IsEnabled = true;
Pause.Content = "继续";
break;
case RecorderStatus.Finishing:
Start.IsEnabled = true;
Pause.IsEnabled = false;
Stop.IsEnabled = false;
break;
default:
break;
}
});
}
private void _recorder_OnRecordingFailed(object sender, RecordingFailedEventArgs e)
{
//录制失败
App.Current.Dispatcher.Invoke(delegate {
FileResult.Text = "录制失败";
Start.IsEnabled = true;
Pause.IsEnabled = false;
Pause.Content = "暂停";
Stop.IsEnabled = false;
CleanupResources();
});
}
private void _recorder_OnRecordingComplete(object sender, RecordingCompleteEventArgs e)
{
//录制完成
App.Current.Dispatcher.Invoke(delegate {
string filePath = e.FilePath;
FileResult.Text = filePath;
Start.IsEnabled = true;
Pause.IsEnabled = false;
Pause.Content = "暂停";
Stop.IsEnabled = false;
CleanupResources();
});
}
private void UpdateProgress()
{
App.Current.Dispatcher.Invoke(delegate
{
TimeStamp.Text = TimeSpan.FromSeconds(_secondsElapsed).ToString();
});
}
private void CleanupResources()
{
_timer?.Stop();
_timer = null;
_secondsElapsed = 0;
_recorder?.Dispose();
_recorder = null;
}
private void Stop_Click(object sender, RoutedEventArgs e)
{
try
{
_recorder.Stop();
_timer?.Stop();
_timer = null;
_secondsElapsed = 0;
Start.IsEnabled = true;
Stop.IsEnabled = false;
Pause.IsEnabled = false;
}
catch (Exception ex)
{
Start.IsEnabled = false;
Stop.IsEnabled = true;
Pause.IsEnabled = true;
MessageBox.Show(ex.Message);
}
}
private void Pause_Click(object sender, RoutedEventArgs e)
{
if (_recorder.Status == RecorderStatus.Paused)
{
_recorder.Resume();
return;
}
_recorder.Pause();
}
private void SaveAs_Click(object sender, RoutedEventArgs e)
{
try
{
string filepath = FileResult.Text;
if (string.IsNullOrEmpty(filepath)) throw new Exception("请先录制视频");
if (!File.Exists(filepath)) throw new Exception("视频不存在");
SaveFileDialog s = new SaveFileDialog();
s.Filter = "视频文件|*.mp4";
s.FileName=Path.GetFileName(filepath);
s.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
if (s.ShowDialog() == true)
{
string pathFile = s.FileName;
File.Copy(filepath, pathFile, true);
File.Delete(filepath);
MessageBox.Show("保存成功");
//using (NamedPipeClientStream pipeClient = new NamedPipeClientStream("localhost", "GEWorker", PipeDirection.InOut, PipeOptions.None, TokenImpersonationLevel.None))
//{
// pipeClient.Connect(2000);
// using (StreamWriter sw = new StreamWriter(pipeClient))
// {
// sw.WriteLine(pathFile);
// sw.Flush();
// }
//}
//Environment.Exit(0);//强退程序
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void MaterialWindow_Closed(object sender, EventArgs e)
{
try
{
//using (NamedPipeClientStream pipeClient = new NamedPipeClientStream("localhost", "GEWorker", PipeDirection.InOut, PipeOptions.None, TokenImpersonationLevel.None))
//{
// pipeClient.Connect(2000);
// using (StreamWriter sw = new StreamWriter(pipeClient))
// {
// sw.WriteLine("");
// sw.Flush();
// }
//}
}
catch { }
}
}