본문 바로가기
프로그래밍

화면녹화 프로그램 만들기[0]

by minimax95 2020. 5. 3.

화면 녹화 기능은 Windows 10에 탑재가 되어 사용되고 있지만

여기서는 Microsoft의 Expression Encoder 4 SP2 서비스 팩의 dll을 활용하여 심플한 녹화기능을 제공하는 나만의 녹화프로그램을 만들어 보고자 한다.

 

먼저 Visual Studio를 열고 아래와 같이 솔루션을 만들어 주자.

프로그램 이름은 MyCam 이다.

 

먼저 화면 UI를 아래와 같이 구성한다.

간단하게 녹화 시작 버튼과 종료 버튼, 인코딩 버튼과 인코딩 진도를 출력하는 프로그래스바로 화면UI를 구성한다.

 

UI구성 화면에서 각 버튼에 버튼 처리기를 등록해준다.

 

다음으로는 Expression 함수를 사용하기 위해서 dll 참조를 추가해 준다.

참조파일은 Program Files(x86)>Microsoft Expression>Encoder 4>SDK 폴더에서 참조할 수 있으며 위 사진에서

하이라이트된 4개의 파일을 선택하여 DLL을 등록시킨다.

이제 DLL의 함수 사용을 위해 using문을 추가해 준다.

아래의 사진에서 처럼 3개의 using문을 추가한다.

이제 Expression의 객체와 함수를 사용할 준비가 완료되었다.

다음으로는 Expression 객체와 함수를 이용하여 화면 캡쳐 녹화 기능과 음성 녹음 기능을 구현하고 완성된 녹화 파일을 WMV 파일로 인코딩하는 함수를 구현해보자.

 

먼저 화면 녹화 기능을 구현한 함수는 아래와 같다.

private ScreenCaptureJob job;    // 화면을 녹화하는 ScreenCapture 객체 선언

void StartRecording()
{
    job = new ScreenCaptureJob();

    System.Drawing.Size WorkingArea = SystemInformation.WorkingArea.Size;
    Rectangle captureRect = 

            new Rectangle(0, 0, WorkingArea.Width - (WorkingArea.Width % 4),

            WorkingArea.Height - (WorkingArea.Height % 4));

    job.ShowFlashingBoundary = true;
    job.ShowCountdown = true;
    job.CaptureMouseCursor = true;
    job.AddAudioDeviceSource(AudioDevices());   // 오디오 Device 설정
    job.OutputPath = @"D:\JobFile";  // 녹화 파일을 출력하는 폴더
    job.Start();
}

 

오디오 Device 객체를 리턴해주는 함수 구현은 아래와 같다.

EncoderDevice AudioDevices()
{
    EncoderDevice foundDevice = null;
    Collection audioDevices = EncoderDevices.FindDevices(EncoderDeviceType.Audio);
    try
    {
         foundDevice = audioDevices.First();
    }
    catch (Exception ex)
    {
        MessageBox.Show("Cannot find prefered audio device using" + audioDevices[0].Name + ex.Message);
    }
    return foundDevice;

}

 

녹화 종료 후 인코딩을 하기 위해 아래와 같이 기능을 구현해 준다.

void Encode()
{
    if (job != null)
    {
        using (Job j = new Job())
        {
            MediaItem mediaItem = new MediaItem(job.ScreenCaptureFileName);
            var size = mediaItem.OriginalVideoSize;
            WindowsMediaOutputFormat WMV_Format = new WindowsMediaOutputFormat();
            WMV_Format.VideoProfile = new Microsoft.Expression.Encoder.Profiles.AdvancedVC1VideoProfile();
            WMV_Format.AudioProfile = new Microsoft.Expression.Encoder.Profiles.WmaAudioProfile();
            WMV_Format.VideoProfile.AspectRatio = new System.Windows.Size(16, 9); //WindowsBase 참조 
            WMV_Format.VideoProfile.AutoFit = true;

             if (size.Width >= 1920 && size.Height >= 1080)
             {
                  WMV_Format.VideoProfile.Size = new System.Drawing.Size(1920, 1080);
                  WMV_Format.VideoProfile.Bitrate = 

                             new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(6000);
             }
             else if (size.Width >= 1280 && size.Height >= 720)
             {
                  WMV_Format.VideoProfile.Size = new System.Drawing.Size(1280, 720);
                  WMV_Format.VideoProfile.Bitrate = 

                             new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(4000);
             }
             else
             {
                  WMV_Format.VideoProfile.Size = new System.Drawing.Size(size.Width, size.Height);
                  WMV_Format.VideoProfile.Bitrate = 

                             new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(2000);
             }
             mediaItem.VideoResizeMode = VideoResizeMode.Letterbox;
             mediaItem.OutputFormat = WMV_Format;                    

             j.MediaItems.Add(mediaItem);
             j.CreateSubfolder = false;
             j.OutputDirectory = @"D:\JobFile";
             j.EncodeProgress += new EventHandler(j_encodeProgress); // 인코딩 진도 이벤트 처리기 등록
             j.Encode();


        } // End using

    } // End if

}

 

인코딩 시에 인코딩 진도를 사용자에게 알려주기 위해서 아래와 같이 프로그래스바에 진도값을 전달해 준다.

 

이제 각 기능을 구현한 함수를 각 버튼 처리기에서 호출해 준다.

기능 구현은 마무리되었고 약간의 뒷처리가 남았다.

프로그램 종료시 생성했던 job 객체를 Dispose 하도록 FormClosing 이벤트 처리기를 등록해 준다.

여기까지 완료했다면 솔루션 빌드 후에 나만의 화면녹화 프로그램을 사용해 보자.

녹화가 끝나고 나면 우리가 지정했던 D:\JobFile 폴더 아래에 Expression에서 생성한 .xesc 확장자로 영상파일이 저장된다. 인코딩 버튼을 클릭하면 .xesc 확장자 파일을 윈도우 미디어 영상파일인 .wmv 확장자 파일로 변환시킨다.

아래의 사진은 프로그램 실행 후 영상을 녹화하여 인코딩까지 마친 결과물의 사진이다.

 

댓글