[.NET/C#][Win7 x64]基于Windows Media Encoder 的屏幕录像

因为公司的需求要用到屏幕录像,在网上找了一些要么收费的要么外文界面,而且设置参数对于大部分人来说也不友好,于是打算自己做个。

上网搜到有用到傲瑞的插件(MCapture + MFile)开发的,感觉灰常好,功能也堪称完美,但是却不是免费的(你懂的 -。-),各方面考虑还是用Windows Media Encoder(简称WME)来做。


运行界面:



核心代码:

在这里为了方便调用我封装了一个名为“WMEHandler”的类型

        /// <summary>
        /// 实例化
        /// </summary>
        public WMEHandler()
        {
            Encoder = new WMEncoder();
            ProfileConfig(); //配置文件设置
            Status = WMEStatus.Stop;
            IWMEncSourceGroupCollection EncSrcGroups = Encoder.SourceGroupCollection;
            SourceGroup = EncSrcGroups.Add("Video1");
            IWMEncSource SrcVid = SourceGroup.AddSource(WMENC_SOURCE_TYPE.WMENC_VIDEO);
            SrcVid.SetInput("ScreenCapture1", "ScreenCap", ""); //录制对象为屏幕
            WMEncProfile2 Pro = new WMEncProfile2();
            Pro.LoadFromFile(ProfilePath); //读取配置文件
            SourceGroup.set_Profile(Pro);
            IWMEncDisplayInfo Descr = Encoder.DisplayInfo;
            Descr.Author = "Lee"; //视频信息,需要可以自己添加
        }

        /// <summary>
        /// 设置音频输入
        /// </summary>
        /// <param name="input"></param>
        public void SetAudioInput(string input)
        {
            if (!string.IsNullOrEmpty(AudioInput))
            {
                SourceGroup.RemoveSource(WMENC_SOURCE_TYPE.WMENC_AUDIO, SourceGroup.Source[WMENC_SOURCE_TYPE.WMENC_AUDIO, 0]);
            }
            AudioInput = input;
            var Ies = SourceGroup.AddSource(WMENC_SOURCE_TYPE.WMENC_AUDIO);
            Ies.SetInput(input, "Device", "");
        }

        /// <summary>
        /// 获取音频设备
        /// </summary>
        /// <returns></returns>
        public static List<string> LocalAudioDrive()
        {
            List<string> DriveList = new List<string>();
            WMEncoder Encoder = new WMEncoder();
            IWMEncSourcePluginInfoManager SrcPlugMgr = Encoder.SourcePluginInfoManager;
            IWMEncDeviceControlPluginInfoManager DCPlugMgr = Encoder.DeviceControlPluginInfoManager;
            IWMEncPluginInfo PlugInfo;
            for (int i = 0; i < SrcPlugMgr.Count; i++)
            {
                PlugInfo = SrcPlugMgr.Item(i);
                if (PlugInfo.SchemeType == "DEVICE" && PlugInfo.Resources == true)
                {
                    for (int j = 0; j < PlugInfo.Count; j++)
                    {
                        if (PlugInfo.MediaType == WMENC_SOURCE_TYPE.WMENC_AUDIO)
                        {
                            DriveList.Add(PlugInfo.Item(j));
                        }
                    }
                }
            }
            return DriveList;
        }


说明:


1.录制/停止 直接调用WMEncoder类对象的Start() 和 Stop()方法即可。界面代码就暂时不贴出来,需要的朋友可以在下载来看。

2.全局快捷键使用的是user32.dll的API,简称“键盘钩子”,想要了解自行度娘。

3.需要修改录制参数的,要在配置文件里修改,配置文件就是prx文件,可以直接双击打开使用WME编辑。



4.有需要其他扩展可以加入一些事件、接口、方法等,在这里暂时用不上所以我没加,有需要可以自己加上去。


注意事项:

1.项目使用Visual Studio 2015 PRE开发,在Win2008R2 x64 和 Win7 x64下运行通过

2.要运行/开发程序必须在电脑上安装Windows Media Encoder (非SDK),而且版本要对应系统版本(32、64位),因为32的WME位不能安装在在64位的系统里,编译文件也要根据系统版本来对应生成,否则程序无法运行。如果要放在32位系统下运行,先在32位的系统下安装Windows Media Encoder,然后用Visual Studio打开项目,把原来引用的WMEncoderLib.Dll移除,然后重新引用32位的WMEncoderLib,项目属性里“生成”的目标平台也要改成“x86”。


3.暂时没遇到需要打补丁的情况,有这种情况的朋友请分享一下解决办法。


2017-02-13更新:

之前有人反馈过不能录制系统声音的,我测试过是可以录制的,原因是系统禁止了“立体声混音”这个录音设备,我在这里给出教程给大家参考。


1.右击任务栏小喇叭 - 录音设备,打开Windows的"录音设备"管理界面,右击 - 显示禁用的设备,打个勾就可以看到“立体声混音”了,把它启用起来。


2.双击打开属性,切换到“侦听”标签,这里有一个“通过此设备播放”的选项,意思是,在多个音频输出的情况下(如前后扬声器分离或者多声卡,可同时播放不同声音),选择需要捕获声音的播放设备,只能选择一个,一般选择默认播放设备就行了,有特殊需要可以选择设备。


3.在程序上面选择录音设备就可以开始录制了。录制出来的声音可能会偏小,这是正常情况。。。- -|||



下载地址:

项目代码

WMEncoder x64

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值