본문 바로가기
프로그래밍

화면녹화 프로그램 만들기[2]_웹캠 추가

by minimax95 2020. 5. 17.

지난 '화면녹화 프로그램 만들기' 1편과 2편 포스팅에서 Microsoft의 Expression Encoder 4 SP2 서비스 팩을 이용해서 간단하게 내 컴퓨터 화면을 동영상으로 녹화하는 프로그램을 만들어 보았습니다.

이번 포스팅에서는 웹캠을 추가하여 화면 녹화 시 카메라에 담긴 나의 영상을 함께 동영상에 담아보겠습니다.

 

먼저 지난 1, 2편에서 사용했던 MyCam 솔루션을 열어두고 웹캠을 사용하기 위한 소스코드를 추가하겠습니다.

현재 UI는 아래와 같이 '녹화시작', '녹화종료', '인코딩' 3개의 버튼으로 구성된 심플한 화면녹화 프로그램입니다. 

여기에 웹캠 사용을 위한 '웹캠열기', '웹캠닫기' 버튼 UI를 추가로 배치하고 기능 구현을 해 보겠습니다.

추가로 패널을 넣어 웹캠으로 촬영하는 영상을 담아내도록 하겠습니다.

패널을 추가하기 위해서 기본 UI 창을 키우고 아래의 그림처럼 UI를 구성해줍니다.

UI는 직관적으로 카메라와 오디오 장치에 대한 리스트 박스를 추가하였고

화면 상단부에 카메라 영상을 담을 패널로 구성하였습니다.

 

웹캠 열기와 웹캠 닫기 버튼 처리기도 UI를 더블클릭하여 아래와 같이 추가해 줍니다.

이제 웹캠을 장착할 준비가 끝났습니다.

웹캠 열기와 닫기 버튼에 웹캠 관련 소스코드를 추가해 보겠습니다.

 

버튼 처리기 구현에 앞서 웹캠 영상을 만들기 위한 핵심 멤버를 소개하겠습니다.

private LiveJob _job;

private LiveDeviceSource _deviceSource;

 

아래의 버튼 처리기에서 위의 핵심 멤버가 어떻게 사용되는지 잘 살펴보시기 바랍니다.

 

// 웹캠 열기

 private void button4_Click(object sender, EventArgs e)
{
    EncoderDevice video = null;
    EncoderDevice audio = null;

    foreach (EncoderDevice edv in EncoderDevices.FindDevices(EncoderDeviceType.Video))

    {

        if((String.Compare(edv.Name, Video_Devices.SelectedItem.ToString()) == 0)

            && Video_Devices.SelectedItem != null)

        {
            video = edv;
            break;
        }
    }

    foreach (EncoderDevice eda in EncoderDevices.FindDevices(EncoderDeviceType.Audio))

    {

        if((String.Compare(eda.Name, Audio_Devices.SelectedItem.ToString()) == 0)

            && Audio_Devices.SelectedItem != null)

        { 
            audio = eda; 
            break; 
        } 

    }

    if ((video == null) || (audio == null))
    {

        MessageBox.Show("웹캠 장치 이상 또는 오디오 장치에 문제가 있습니다.");

        return;

    }

 

    _job = new LiveJob();
    _deviceSource = _job.AddDeviceSource(video, audio); 

    _deviceSource.PickBestVideoFormat(new Size(640, 480), 15);

    SourceProperties sp = _deviceSource.SourcePropertiesSnapshot();

    panel2.Size = new Size(sp.Size.Width, sp.Size.Height);

    _job.OutputFormat.VideoProfile.Size = new Size(sp.Size.Width, sp.Size.Height);

    _deviceSource.PreviewWindow = new PreviewWindow(new HandleRef(panel2, panel2.Handle));

}

 

// 웹캠 닫기

private void button5_Click(object sender, EventArgs e)
{
    if (_job != null)
    {
        _job.RemoveDeviceSource(_deviceSource);
        _deviceSource.PreviewWindow = null;
        _deviceSource = null;
        _job = null;
    }
}

 

추가로 필요한 사항은 프로그램 시작과 동시에 카메라와 오디오 장치 목록을 찾아 리스트를 업데이트하는 기능이 필요합니다. 이것은 폼 로딩 이벤트 처리기를 통해 아래와 같이 구현해 줍니다.

private void Form1_Load(object sender, EventArgs e)
{

    Video_Devices.ClearSelected( );

    foreach (EncoderDevice edv in EncoderDevices.FindDevices(EncoderDeviceType.Video))

    {

        Video.Devices.Items.Add(edv.Name);

    }

    Audio_Devices.ClearSelected( );

    foreach (EncoderDevice eda in EncoderDevices.FindDevices(EncoderDeviceType.Audio))

    {

        Audio.Devices.Items.Add(eda.Name);

    }

}

 

자 이제 모든 구현이 완료되었습니다.

솔루션을 빌드하여 실행해 보겠습니다.

제 얼굴 일부와 손이 보이네요^^

 

이 상태에서 녹화 시작 버튼을 누르면 웹캠으로 촬영한 영상과 화면이 동시에 동영상으로 저장될 것입니다.

요즘 원격 수업을 많이 진행하고 있는데 이 프로그램만 있다면 선생님들께서도 화면에 파워포인트를 띄워놓고 

강의하시는 영상을 촬영할 수 있습니다.

 

감사합니다.

댓글