原文地址: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#实现录音录像录屏源码的更多相关文章

  1. C#实现录音录像录屏源码

    以前写过两篇录音和录像的文章(实现语音视频录制.在服务器端录制语音视频),最近有朋友问,如果要实现屏幕录制这样的功能,该怎么做了?实际上录屏的原理跟录音.录像是差不多的,如果了解了我前面两篇文章中介绍 ...

  2. 开启全民窃听风云——C#智能录音录像录屏程序源码放送!

    ·引子 我这人从小有个坏毛病,就是喜欢偷窥别人隐私.当然,在道德上,我时刻要求自己做一名正人君子,只不过是心理上有这癖好罢了.所以我从小就对窃听.窃视.黑客技术.破解技术等疯狂着迷!实际上这也是我走上 ...

  3. Android一键锁屏源码

    APK下载 源程序下载 锁屏流程如下(参考于Android一键锁屏开发全过程[源码][附图]) 源码参考于一键锁屏 源码 一共有2个Java文件: package com.example.onekey ...

  4. 《App研发录》 源码

    第1章源码: 1.1 重新规划Android项目结构 1.1.zip 1.2 为Activity定义新的生命周期 1.2.zip 1.3 统一事件编程模型 1.3.zip 1.4 实体化编程 1.4. ...

  5. C#开源录音组件、录像组件、录屏组件及demo源码

    在多媒体系统中,一般都会涉及到录音.录像.录屏问题,采集得到的数据可以用来传输.播放.或存储.所以,对于像课件录制系统.语音视频录制系统.录屏系统等,多媒体数据的采集就是最基础的功能之一. MCapt ...

  6. android形状属性、锁屏密码、动态模糊、kotlin项目、抖音动画、记账app、视频播放器等源码

    Android精选源码 直观了解Android的"形状"属性如何影响Drawable的外观. 一个灵活的视频播放器, 可替换播放器内核. android锁屏输入密码功能源码 背景动 ...

  7. 实战录 | Kafka-0.10 Consumer源码解析

    <实战录>导语 前方高能!请注意本期攻城狮幽默细胞爆表,坐地铁的拉好把手,喝水的就建议暂时先别喝了:)本期分享人为云端卫士大数据工程师韩宝君,将带来Kafka-0.10 Consumer源 ...

  8. [转] - 使用Qt作窗口截屏(含源码)

    截屏(screenshot),就是将屏幕上的东西拷贝下来存成图片文件.介绍的好像有点多余:(,那我们就直接切入正题. QPixmap提供了两个函数grabWidget和grabWindow可以将屏幕上 ...

  9. android后台截屏实现(2)--screencap源码修改

    首先找到screencap类在Android源码中的位置,/442/frameworks/base/cmds/screencap/screencap.cpp 源码如下: /* * Copyright ...

随机推荐

  1. 'NSUnknownKeyException', reason:....etValue:forUndefinedKey:]: this class is not key value coding-compliant for the key

    erminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MainTableViewControl ...

  2. RFID Reader ICs

    http://www.advanide.com/readeric.htm Low Frequency Reader ICs Manufacturer Product Frequency ISO Com ...

  3. rc_80 tomcat 日志

    1 #!/bin/sh 2 cd /mnt/tomcat/tomcat_8082/logs; 3 tail -f catalina.out;

  4. 【spring boot】整合LCN,启动spring boot2.0.3 启动报错:Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

    spring boot 2.0.3启动报错: Error starting ApplicationContext. To display the conditions report re-run yo ...

  5. 轻量级java开发(一)-Hibernate 安装

    1.从http://hibernate.org/orm/downloads/下载Hibernate 目前最新版是4.3.0.Final  支持JPA 2.1 support 2.解压下载的压缩文件,导 ...

  6. php 方法笔记 比file_get_contents好

    /*比file_get_contents稳定的多!$timeout为超时时间,单位是秒,默认为1s.*/ private function curl_get_contents($url,$timeou ...

  7. JOIN与EXISTS(子查询)的效率研究

    使用MySQL提供的Sample数据库Sakila 现将profiling打开,用来一会查看sql执行时间 set profiling=1; exists 子查询与 join联接效率的对比,功能:查看 ...

  8. feedparser win7 python 安装

    要获取订阅源读取当中的内容,Universal Feed Parser提供了非常多的API,这里说下详细的配置. 我的配置环境: win7 + python 2.7.5 步骤: 1.下载feedpar ...

  9. USACO ariprog 暴力枚举+剪枝

    /* ID:kevin_s1 PROG:ariprog LANG:C++ */ #include <iostream> #include <cstdio> #include & ...

  10. iOS:判断引导页首次出现、版本更新

    判断引导页首次出现方式: //选择根控制器 +(void)chooseRootViewController{ //初始化Window窗口 [AppDelegate Delegate].window = ...