最近由于项目需求,需要屏幕录像功能。
经过查找资料发现Microsoft Expression Encoder 4 SDK提供了屏幕录像的功能,并简单实现了该功能。
主要实现代码
1 using System; 2 using System.Collections.ObjectModel; 3 using System.Drawing; 4 using System.IO; 5 using System.Windows.Forms; 6 using Microsoft.Expression.Encoder; 7 using Microsoft.Expression.Encoder.Devices; 8 using Microsoft.Expression.Encoder.Profiles; 9 using Microsoft.Expression.Encoder.ScreenCapture; 10 11 namespace ScreenCapture 12 { 13 public partial class Form1 : Form 14 { 15 public Form1() 16 { 17 InitializeComponent(); 18 } 19 20 //定义屏幕截图job 21 ScreenCaptureJob screencapturejob = new ScreenCaptureJob(); 22 //设置临时目录 23 string path = "c:\\"+Guid.NewGuid().ToString(); 24 25 /// <summary> 26 /// 开始录制 27 /// </summary> 28 /// <param name="sender"></param> 29 /// <param name="e"></param> 30 private void button1_Click(object sender, EventArgs e) 31 { 32 screencapturejob.OutputPath = path; 33 Collection<EncoderDevice> devices = EncoderDevices.FindDevices(EncoderDeviceType.Audio);//查询当前所有音频设备 34 foreach (EncoderDevice device in devices) 35 { 36 try 37 { 38 screencapturejob.AddAudioDeviceSource(device);//将音频设备的声音记录 39 } 40 catch { 41 //抛出其他异常的音频设备 42 } 43 } 44 //录制开始 45 screencapturejob.Start(); 46 } 47 48 /// <summary> 49 /// 停止录制 50 /// </summary> 51 /// <param name="sender"></param> 52 /// <param name="e"></param> 53 private void button2_Click(object sender, EventArgs e) 54 { 55 label1.Text = "正在处理..."; 56 screencapturejob.Stop();//停止录制job 57 string xescfile = GetxescPath();//获取录制文件路径 58 MediaItem src = new MediaItem(xescfile);//加入转换媒体 59 60 //获取屏幕信息 61 Rectangle rect = new Rectangle(); 62 rect =Screen.PrimaryScreen.Bounds; 63 // Screen.AllScreens 64 65 //重新定义视频格式 66 src.OutputFormat = new WindowsMediaOutputFormat(); 67 src.OutputFormat.VideoProfile = new AdvancedVC1VideoProfile(); 68 src.OutputFormat.VideoProfile.Bitrate = new VariableConstrainedBitrate(1000, 1500); 69 src.OutputFormat.VideoProfile.Size = new Size(rect.Width, rect.Height); 70 src.OutputFormat.VideoProfile.FrameRate = 30; 71 src.OutputFormat.VideoProfile.KeyFrameDistance = new TimeSpan(0, 0, 4); 72 73 //重新定义音频格式 74 src.OutputFormat.AudioProfile = new WmaAudioProfile(); 75 src.OutputFormat.AudioProfile.Bitrate = new VariableConstrainedBitrate(128, 192); 76 src.OutputFormat.AudioProfile.Codec = AudioCodec.WmaProfessional; 77 src.OutputFormat.AudioProfile.BitsPerSample = 24; 78 79 Job encoderjob = new Job();//实例化转换作业 80 encoderjob.MediaItems.Add(src);//添加xesc文件 81 //encoderjob.ApplyPreset(Presets.VC1HD720pVBR);//设置视频编码 82 encoderjob.CreateSubfolder = false;//不创建文件夹 83 encoderjob.OutputDirectory = "C:\\output";//设置转换完后的文件保存目录 84 encoderjob.EncodeCompleted += job2_EncodeCompleted; 85 86 encoderjob.Encode(); 87 88 if (File.Exists(xescfile)) File.Delete(xescfile); 89 if (Directory.Exists(path)) Directory.Delete(path); 90 } 91 92 void job2_EncodeCompleted(object sender, EncodeCompletedEventArgs e) 93 { 94 label1.Text = "处理完成..."; 95 } 96 97 private string GetxescPath() 98 { 99 string result = ""; 100 FileInfo[] filelist = new DirectoryInfo(path).GetFiles("*.xesc"); 101 foreach (FileInfo NextFile in filelist) 102 { 103 result = NextFile.FullName; 104 break; 105 } 106 return result; 107 } 108 } 109 }
源代码:ScreenCapture.7z
本源码为VS2012项目,需要.net framework 4.0支持。
如果编译失败,请重新引用Microsoft.Expression.Encoder.dll,Microsoft.Expression.Encoder.Types.dll,Microsoft.Expression.Encoder.Utilities.dll