C#實現錄音錄影錄屏原始碼

zhuweisky發表於2014-03-11

  以前寫過兩篇錄音和錄影的文章(實現語音視訊錄製在伺服器端錄製語音視訊),最近有朋友問,如果要實現螢幕錄製這樣的功能,該怎麼做了?實際上錄屏的原理跟錄音、錄影是差不多的,如果瞭解了我前面兩篇文章中介紹的內容,只要在它們的基礎上做一些修改就可以了。

一.錄屏原理

   錄製螢幕的實現方案仍然基於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版本。 

          音效卡錄製原始碼、 混音&錄製原始碼、  同時錄製(桌面+麥克風+音效卡)原始碼、 麥克風攝像頭錄製(可預覽) 

          錄製畫中畫(桌面+攝像頭+麥克風/音效卡)。 

          遠端錄製或在伺服器端錄製語音視訊螢幕

 

敬請了解:

ESFramework通訊框架     OMCS網路語音視訊框架     MFile語音視訊錄製元件    MCapture語音視訊採集元件  StriveEngine輕量級通訊引擎    OAUS 自動升級系統 

 

相關文章