[转]C#实现录音录像录屏源码
原文地址:http://www.cnblogs.com/zhuweisky/p/3593917.html
以前写过两篇录音和录像的文章(实现语音视频录制、在服务器端录制语音视频),最近有朋友问,如果要实现屏幕录制这样的功能,该怎么做了?实际上录屏的原理跟录音、录像是差不多的,如果了解了我前面两篇文章中介绍的内容,只要在它们的基础上做一些修改就可以了。
一.录屏原理
录制屏幕的实现方案仍然基于OMCS+MFile构建,原理与实现语音视频录制差不多,我这里只列出其中的主要差异:
(1)使用DynamicDesktopConnector连接到屏幕桌面。
(2)使用定时器(比如10fps,则每隔100ms一次)定时调用DynamicDesktopConnector的GetCurrentImage方法,把得到的图像使用MFile写入视频文件。
(3)源码演示的是不需要同时录制麦克风的声音,所以使用了MFile提供的SilenceVideoFileMaker组件(而非原来的VideoFileMaker组件),仅仅录制视频数据。
(4)通过MultimediaManager的DesktopEncodeQuality属性,控制屏幕图像的清晰度。
二.录屏源码
源码如下所示,如果不想下载源码,可以直接通过下面的代码了解详细的实现思路。

public partial class Form1 : Form
{
private MultimediaServer server; //在本地内嵌OMCS服务器
private IMultimediaManager multimediaManager;
private SilenceVideoFileMaker maker = new SilenceVideoFileMaker(); //录制无声视频
private DynamicDesktopConnector dynamicDesktopConnector = new DynamicDesktopConnector(); //远程桌面连接器 public Form1()
{
InitializeComponent();
int port = 9900;
OMCSConfiguration config = new OMCSConfiguration(10,8, EncodingQuality.High,16000,640,480,"") ;
this.server = new MultimediaServer(port, new DefaultUserVerifier(), config, false, null); this.multimediaManager = MultimediaManagerFactory.GetSingleton();
this.multimediaManager.DesktopEncodeQuality = 1; //通过此参数控制清晰度
this.multimediaManager.Initialize("aa01", "", "127.0.0.1", port); this.dynamicDesktopConnector.ConnectEnded += new ESBasic.CbGeneric<ConnectResult>(dynamicDesktopConnector_ConnectEnded);
this.dynamicDesktopConnector.BeginConnect("aa01"); //连接本地桌面 this.Cursor = Cursors.WaitCursor;
} void dynamicDesktopConnector_ConnectEnded(ConnectResult obj)
{
System.Threading.Thread.Sleep(500);
this.Ready();
} private void Ready()
{
if (this.InvokeRequired)
{
this.BeginInvoke(new CbGeneric(this.Ready));
}
else
{
this.Cursor = Cursors.Default;
this.button1.Enabled = true;
this.label1.Visible = false;
}
} private System.Threading.Timer timer;
private void button1_Click(object sender, EventArgs e)
{
try
{
Oraycn.MFile.GlobalUtil.SetAuthorizedUser("FreeUser", "");
//初始化H264视频文件
this.maker.Initialize("test.mp4", VideoCodecType.H264, this.dynamicDesktopConnector.DesktopSize.Width, this.dynamicDesktopConnector.DesktopSize.Height, 10); this.timer = new System.Threading.Timer(new System.Threading.TimerCallback(this.Callback), null ,0, 100);
this.label1.Text = "正在录制......";
this.label1.Visible = true;
this.button1.Enabled = false;
this.button2.Enabled = true;
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
} //定时获取屏幕图像,并使用MFile写入视频文件
private void Callback(object state)
{
Bitmap bm = this.dynamicDesktopConnector.GetCurrentImage();
this.maker.AddVideoFrame(bm);
} private void button2_Click(object sender, EventArgs e)
{
this.timer.Dispose();
this.button1.Enabled = false;
this.button2.Enabled = false;
this.label1.Visible = false; this.maker.Close(true);
MessageBox.Show("生成视频文件成功!");
}
}

三.源码开源下载
2015.01.06 现在更好的方案是 MCapture + MFile,将声卡/麦克风/摄像头/屏幕的采集与录制集中在一个源码中,截图运行如下:

2014.11.26 现在录制本地的语音、视频、屏幕的最好的方案是MCapture + MFile,而不是通过OMCS绕一大圈,相应的源码源码下载:Oraycn.Record源码.rar 。
当然,如果是远程录制语音、视频、屏幕,最好的方案是OMCS + MFile。
2015.6.18 整理全部相关开源源码如下:
(声卡/麦克风/摄像头/屏幕)采集&录制源码源码:WinForm版本、WPF版本。
声卡录制源码、 混音&录制源码、 同时录制(桌面+麦克风+声卡)源码、 麦克风摄像头录制(可预览)
[转]C#实现录音录像录屏源码的更多相关文章
- C#实现录音录像录屏源码
以前写过两篇录音和录像的文章(实现语音视频录制.在服务器端录制语音视频),最近有朋友问,如果要实现屏幕录制这样的功能,该怎么做了?实际上录屏的原理跟录音.录像是差不多的,如果了解了我前面两篇文章中介绍 ...
- 开启全民窃听风云——C#智能录音录像录屏程序源码放送!
·引子 我这人从小有个坏毛病,就是喜欢偷窥别人隐私.当然,在道德上,我时刻要求自己做一名正人君子,只不过是心理上有这癖好罢了.所以我从小就对窃听.窃视.黑客技术.破解技术等疯狂着迷!实际上这也是我走上 ...
- Android一键锁屏源码
APK下载 源程序下载 锁屏流程如下(参考于Android一键锁屏开发全过程[源码][附图]) 源码参考于一键锁屏 源码 一共有2个Java文件: package com.example.onekey ...
- 《App研发录》 源码
第1章源码: 1.1 重新规划Android项目结构 1.1.zip 1.2 为Activity定义新的生命周期 1.2.zip 1.3 统一事件编程模型 1.3.zip 1.4 实体化编程 1.4. ...
- C#开源录音组件、录像组件、录屏组件及demo源码
在多媒体系统中,一般都会涉及到录音.录像.录屏问题,采集得到的数据可以用来传输.播放.或存储.所以,对于像课件录制系统.语音视频录制系统.录屏系统等,多媒体数据的采集就是最基础的功能之一. MCapt ...
- android形状属性、锁屏密码、动态模糊、kotlin项目、抖音动画、记账app、视频播放器等源码
Android精选源码 直观了解Android的"形状"属性如何影响Drawable的外观. 一个灵活的视频播放器, 可替换播放器内核. android锁屏输入密码功能源码 背景动 ...
- 实战录 | Kafka-0.10 Consumer源码解析
<实战录>导语 前方高能!请注意本期攻城狮幽默细胞爆表,坐地铁的拉好把手,喝水的就建议暂时先别喝了:)本期分享人为云端卫士大数据工程师韩宝君,将带来Kafka-0.10 Consumer源 ...
- [转] - 使用Qt作窗口截屏(含源码)
截屏(screenshot),就是将屏幕上的东西拷贝下来存成图片文件.介绍的好像有点多余:(,那我们就直接切入正题. QPixmap提供了两个函数grabWidget和grabWindow可以将屏幕上 ...
- android后台截屏实现(2)--screencap源码修改
首先找到screencap类在Android源码中的位置,/442/frameworks/base/cmds/screencap/screencap.cpp 源码如下: /* * Copyright ...
随机推荐
- HDU 4669 Mutiples on a circle (2013多校7 1004题)
Mutiples on a circle Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Oth ...
- CC1101是一种低成本真正单片的UHF收发器
CC1101是一种低成本真正单片的UHF收发器,为低功耗无线应用而设计.电路主要设定为在315.433.868和915MHz的ISM(工业,科学和医学)和SRD(短距离设备)频率波段,也可以容易地设置 ...
- HDUJ 1392 Surround the Trees 凸包
Surround the Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- ArcGIS for Android图层记录数,图层选择记录,图层字段数
Log.d("图层记录数:", "" + pFeatureLayer.getFeatureTable().getNumberOfFeatures()); Log ...
- spingBoot-自定义过滤器
package com.cx.springboot.filters; import java.io.IOException; import javax.servlet.Filter; import j ...
- 发布一个C++版本的ORM库SmartDB
先简单说说ORM的优点: 提高开发效率,减少重复劳动,只和业务实体打交道,由业务实体自动生成sql语句,不用手写sql语句. 简单易用, 可维护性好. 隔离数据源,使得我们更换数据源时不用修改代码. ...
- Windows上的git配置
Git下载: 网站:https://code.google.com/p/msysgit/ 文件:https://msysgit.googlecode.com/files/Git-1.8.4-previ ...
- [Android Pro] 分析 Package manager has died
reference to : http://blog.csdn.net/xxooyc/article/details/50162523 这是今天遇到的一个issue,由于Binder造成的.虽然比较简 ...
- 完全理解Gson(2):Gson序列化
通过调用 Gson API 可以把 Java 对象转换为 JSON 格式的字符串(项目主页).在这篇文章中,我们将会讲到如何通过 Gson 默认实现和自定义实现方式,将 Java 对象转换为 JSO ...
- Informatica 常用组件Source Qualifier之一 概述
转换类型:主动.已连接 1 Source Qualifier 概述 当你添加关系表或平面文件源定义至映射时,需要将它连接至 Source Qualifier 组件.Source Qualifier ...