很佩服录像专家软件的功能,前两天一直在尝试实现自己的屏幕录像功能,进行了技术资料搜集和技术探索实现。该技术是基于开源项目CamStudio,将作为国信司南公司的未来技术产品功能的一部分。

  技术资料搜集阶段筛选出两种有用资源:

1)ScrRecX是ActiveX插件,商业插件,有详细的二次开发代码实例,经测试,效果很好,录制的视频会有水印,但最终未能找到破解版。ActiveX Screen Video Recorder   :

  ScrRecX Screen Video Recorder is an ActiveX component. It allows you to incorporate the video recording capabilities into your own applications.

  Main Features

  • Allows you to select a screen area or window to record.
  • Supports multiple monitors.
  • Records video as AVI or WMV.
  • Records audio and synchronizes it with video.
  • Supports various video/audio codecs.
  • Video Setup (video compressor, frame rate, and more).
  • Audio Setup (audio device, audio input, audio compressor, sample rate, bits per sample, and more).
  • Scaling video on the fly.
  • Pause/Resume modes.
  • Optionally highlights the mouse pointer.
  • The recording area can follow the mouse pointer.
  • Can display the flashing border.
  • Allows you to use the unregistered ActiveX DLL  (Example)
  • The package contains our FM Screen Capture lossless video compressor for creating demonstrations/tutorials (See FM Screen Capture codec to learn more).
  • Supports almost any language Visual Basic, C#, C++, Delphi, and more.  (Examples)
  • ScrRecX is supplied with many working examples.

ScrRecX功能很强大,实例代码很多,方便二次开发应用,但价格也不菲,初期建议公司购买,以便以后长期使用。

2)开源的CamStudio,是C++开源项目,提供源代码,但为提供二次开发接口,不利于应用。

  CamStudio records activity from your screen and audio from a microphone into AVI video files and can also convert the AVIs into Streaming Flash videos (SWFs) using its built-in SWF Producer. Latest Stable Version: Camstudio-2.0-w32.zip

  我先前花费大量的时间寻找ScrRecX的破解注册码,自己甚至使用ExploreSuite工具想破解DLL,消除视频水印,但都无功而返。改造CamStudio对我个人来说,是有很大困难的,比较不太熟悉C++。正当我彷徨时,发现让我柳暗花明的消息,原来CamStudio有命令行版的CamStudio Command Line V0.1 Released,这样就可以被WINFORM程序调用啦。下载:http://camstudio.org/CamStudio_cl.01.zip

命令行截图如:

该工具需要三个参数:codec(视频编码,有下面0-14种编码方式)、outputfile(输出的AVI的完整路径)、 seconds(指定录制时间几秒,该项可缺省,缺省时需要输入ENTER键,才能停止输出)

测试命令行代码:C:\camstudio_cl.exe -codec 5 -outfile C:\12345.avi -seconds 10

C:\camstudio_cl.exe -codec 5 -outfile C:\12345.avi (需要手动输入enter结束视频录制)

技术探索实现:winform 调用camstudio_cl.exe

该实验程序只是验证了可行性,将技术路线摸清了。在做实验程序中遇到最大的问题是:主程序如何与另一线程的camstudio_cl.exe进行通信?即如何向camstudio_cl.exe输入ENTER键结束屏幕录像。

开始录像部分关键代码:

代码

         private void BeginScreenRecord() 
        {
            string RecordArguments = @" -codec 5 -outfile " + _VideoPath;
            //要调用外部程序的相对路径
            p.StartInfo.FileName = _RecorderPath;
            //参数
             p.StartInfo.Arguments = RecordArguments;
            //不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN)
           p.StartInfo.UseShellExecute = false;
            //不创建进程窗口
             p.StartInfo.CreateNoWindow = true;
            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            p.Start();//启动线程
        }

关键是如何与另一进程程序进行交互,这里涉及到WIN32 API 编程(请参照:http://www.cnblogs.com/wuhenke/archive/2010/04/13/1711380.html),我花费了四个小时左右时间来实验探索,主要困扰在是使用SendMessage / PostMessage 还是PostThreadMessage。经测试,这里只能使用PostMessage发消息才能结束视频录制。

SendMessage Function
Sends the specified message to a window or windows. The SendMessage function calls the window procedure for the specified window and does not return until the window procedure has processed the message.

PostMessage Function
Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.To post a message in the message queue associated with a thread, use the PostThreadMessage function.

PostThreadMessage Function

Posts a message to the message queue of the specified thread. It returns without waiting for the thread to process the message.

 PostMessage和SendMessage的区别
1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。而且,PostMessage的返回值表示PostMessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。这点大家应该都明白。 2, 如果在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口。SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。 如果在不同线程内。最好用PostThreadMessage代替PostMessage,他工作的很好。SendMessage发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待(事实上,他应该还在做一些监测工作,比如监视QS_SENDMESSAGE标志),直到目标窗口处理完并且结果返回,发送消息的线程才继续运行。这是SendMessage的一般情况,事实上,处理过程要复杂的多。比如,当发送消息的线程监测到有别的窗口SendMessage一个消息到来时,他直接调用窗口处理过程(重入),并将处理结果返回(这个过程不需要消息循环中GetMessage等的支持)。 3, msdn: If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail. 如果发送的消息码在WM_USER之下(非自定义消息)且消息参数中带有指针,那么PostMessage,SendNotifyMessage,SendMessageCallback这些异步消息发送函数将会调用失败。 最好不要用PostMessage发送带有指针参数的消息。

摘自:http://blog.csdn.net/Aoouch/archive/2007/03/09/1525457.aspx

结束视频录制的关键代码:

代码

       [DllImport("user32.dll", SetLastError = true)]
       static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
       [DllImport("user32.dll", SetLastError = true)]
       static extern IntPtr PostMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool SetForegroundWindow(IntPtr hWnd);
        const UInt32 WM_KEYDOWN =0X100;
        const UInt32 WM_KEYUP = 0x101;
        const UInt32 WM_CHAR = 0X102;
        const Int32 VK_RETURN = 0X0D; //enter键代码
        /// <summary>
        /// 结束屏幕录制
        /// </summary>
        private void EndScreenRecorder()
        { 
            IntPtr hWnd = FindWindow(null, _RecorderPath);
           // // SetForegroundWindow(hWnd);
            PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0); 
           //阻塞等待进程结束
            p.WaitForExit();
           // PostMessage(hWnd, WM_KEYUP, VK_RETURN, 0);
            p.Close();//关闭进程
             p.Dispose();//释放资源
        }

希望上面的探索工作能帮网友们少走弯路!

实例程序下载:下载

参考资料:

Enum Windows & SendMessage API  http://www.developerfusion.com/article/34/enum-windows-sendmessage-api/3/

http://msdn.microsoft.com/en-us/library/ms644944(v=VS.85).aspx

http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx

http://msdn.microsoft.com/en-us/library/ms644946(v=VS.85).aspx

Virtual-Key Codes   http://msdn.microsoft.com/en-us/library/ms927178.aspx

http://www.pinvoke.net/

http://sourceforge.net/projects/camstudio/

   补充:在实际应用中我修改了CamStudio_CL的源代码,除去codec参数设置,改为自动寻找最优视频编码;提高帧频和压缩率。修改后CamStudio_CL.exe只需要输出路径即可。——2010-6-23
 本博客声明:本人的技术探索过程中,得到了国信司南公司方面物质和精神支持。今后,本人博客里的所有技术探索成果将归“无痕客”、“国信司南”和“博客园”三方共同所有,原创作品如需转载,请注明本博客声明。 

转载于:https://www.cnblogs.com/wuhenke/archive/2010/06/19/1760980.html

屏幕录像功能技术探索及分享相关推荐

  1. python 自动化运维 读取交换机数据_技术干货|数据中心自动化运维技术探索之交换机零配置上线...

    近几年来,互联网行业处于一个快速发展的快车道,一个又一个风口不断地涌向周边行业.共享单车的出现解决了人们出行***一公里的问题:新零售概念的提出,无人货柜的出现,更是将线上和线下的数据打通,优化了人们 ...

  2. 嘉宾PPT分享|泛娱乐领域音视频技术探索与实践

    2021·MCtalk 5G 技术大带宽.低延时.海量连接的特点,让短视频.直播购物.游戏.音视频社交等变得更加简单,同时,互联网的发展带来了泛娱乐领域的多样化体验,让大众对于 AI 以及音视频的体验 ...

  3. 视频通信关键技术探索及实践

    导读:2021年10月21日,「QCon 全球软件开发大会」在上海举办,网易智企技术 VP 陈功作为出品人发起了「AI 时代下的融合通信技术」专场,邀请到多位技术专家与大家一起分享相关技术话题. 我们 ...

  4. 腾讯PAG动画组件技术,8K内容生产和传输应用实践,xR虚拟拍摄技术探索,影视生产与互联网音视频...

    腾讯PAG动画组件技术 Topic <动效素材极速交付:腾讯PAG动画组件技术揭秘> 陈仁健  腾讯 OVBU 计算内容中心副总监 音视频产品中的动效素材需求是源源不断的,例如贴纸花字,转 ...

  5. 淘宝人生专属“小屋”——虚拟人和虚拟场景技术探索

    本文将分享来自淘宝人生团队齐力打造的新玩法--"人生小屋"背后的技术方案,详细介绍如何使用3D渲染引擎从0到1搭建虚拟场景.控制虚拟角色.实现人景交互.优化渲染效果等.笔者在其中主 ...

  6. 蚂蚁金服ATEC技术探索大会造访伦敦,只为讲好一个普惠金融愿景

    小蚂蚁说: 英国当地时间6月11日,一年一度为期一周的伦敦科技周(London Tech Week)正式拉开帷幕.作为伦敦科技周的重要组成部分,蚂蚁金服ATEC技术探索大会在伦敦科技周首日在威斯敏斯特 ...

  7. 从入门到深入:移动平台模型裁剪与优化的技术探索与工程实践

    可以看到,通过机器学习技术,软件或服务的功能和体验得到了质的提升.比如,我们甚至可以通过启发式引擎智能地预测并调节云计算分布式系统的节点压力,以此改善服务的弹性和稳定性,这是多么美妙. 而对移动平台来 ...

  8. 智能化测试技术探索与实践——AAAS/IEEE Fellow、北京大学讲席教授谢涛阿里行

    谢涛教授简介 谢涛教授长期从事软件工程的研究,在软件测试.软件解析学.软件安全.智能软件工程.教育软件工程等方面做出了很多开创性的工作及突出的研究成果,因此先后当选美国计算机协会杰出科学家(ACM D ...

  9. GitChat · 安全 | 基于机器学习的 Webshell 发现技术探索

    GitChat 作者:兜哥 原文: 基于机器学习的 Webshell 发现技术探索 关注公众号:GitChat 技术杂谈,一本正经的讲技术 第十一章WebShell检测 WebShell就是以ASP. ...

最新文章

  1. 02.uri-search
  2. 面型对象 (接口与类的区别)
  3. 经典冒泡排序及其优化
  4. 基于TableStore的亿级订单管理解决方案
  5. mybatis学习笔记--常见的错误
  6. Ctrl+F5和F5区别
  7. Java之校园卡管理系统
  8. CPLEX——关键字
  9. python开发微信点餐_微信点餐平台开发 (一)
  10. NBSI2内部功能实现大揭谜 1
  11. 数学建模相关知识梳理
  12. 《对比Excel,轻松学习Python数据分析》读书笔记------Pandas入门
  13. php实现微信第三方登录
  14. iOS开发之如何保证控件位置不变,增加触控范围(即frame和bounds的区别)
  15. jenkins调用shell脚本实现自动上线完整项目---此项目中用到了git parameter、choise parameter参数化构建(五)
  16. 【Ubuntu touch for xiaomi 8】小米8第三方ROM
  17. GetComponentsInChildren 不能获取enabled = false的子物体
  18. 如何画神经网络模型图
  19. 学会其中一个,轻松日入400+,今日头条隐藏的6大赚钱功能
  20. android加入图片命名规则

热门文章

  1. alsa 添加codec
  2. STC8单片机1T模式跑RTX51
  3. flash 调用 脚本_Flash脚本-DNA双螺旋
  4. (转)造势满分的摩羯智投都存在哪些问题?
  5. c语言中十六进制乘以16啥意思,C语言16进制中16怎么表示?
  6. Hadoop入门教程 详细的入门实战教程
  7. 海尔微型台式计算机重装系统,海尔台式电脑怎么进行U盘一键重装win10系统
  8. dota有哪些经典的典故或笑话?
  9. Python基础1:数据类型、序列
  10. Html标签分类及总结