# 마법의 거울(Vala)

지스트리머와 GTK+로 웹캠을 거울처럼 사용합니다
Daniel G. Siegel
dgsiegel@gnome.org
Johannes Schmid
jhs@gnome.org
Marta Maria Casetti
mmcasetti@gmail.com 2013
조성호
shcho@gnome.org 2017-2019.

# 마법의 거울

      거울이 벽에서 떨어져 나가 수많은 조각으로 깨졌습니다. 그러나 턱수염을 면도하거나 화장을 하려면 거울이 필요합니다! 통근 버스를 잡기까지 15분 밖에 안남았습니다. 뭘 할 수 있을까요?
      이 따라하기 지침을 통해 웹 캠을 거울로 사용하는 프로그램을 만들겠습니다. 다음 방법을 배워나갑니다:

        GTK+ 프로그램 만들기
        지스트리머로 웹캠에 접근해서 결과 동영상을 창에 넣기
        웹 캠으로 사진 찍기

      이 지침을 따라갈 수 있으려면 다음이 필요합니다:

        안주타 IDE 설치 사본
        GTK, 지스트리머, Vala 컴파일러 설치
        객체 지향 프로그래밍 언어 기본 지식

# 안주타에서 프로젝트 만들기

코딩을 시작하기 전에 안주타에서 새 프로젝트를 설정해야합니다. 이 프로그램은 빌드에 필요한 모든 파일을 만들고 그 다음 코드를 실행합니다. 또한 이 모든 상태를 유지 관리하는데 쓸만합니다.

안주타를 시작하고 파일새로 만들기프로젝트 를 눌러 프로젝트 마법사를 여십시오.

Vala 탭에서 GTK+ (단순)를 선택하고, 계속을 누른 다음, 나타난 페이지에서 몇가지 자세한 내용을 입력하십시오. 프로젝트 이름과 디렉터리에 magic-mirror를 입력하십시오.

따라하기 지침을 통해 사용자 인터페이스를 직접 만들 예정이므로 사용자 인터페이스에 GtkBuilder 사용 설정을 끄십시오. 인터페이스 빌더 사용법을 알아보려면 기타 조율 프로그램 따라하기 지침서를 확인하십시오.

외부 패키지 설정을 켬으로 설정했는지 확인하십시오. 다음 페이지의 목록에서 gstreamer-0.10를 선택하여 프로젝트에 지스트리머 라이브러리를 넣으십시오.

적용을 누르면 프로젝트를 만들어줍니다. 프로젝트나 파일탭에서 src/magic_mirror.vala 파일을 여십시오. 다음 줄로 시작하는 일부 코드를 볼 수 있습니다:

using GLib; using Gtk;

# 첫 코드 작성

코드에서 (비어 있는) 창을 불러와서 보여줍니다. 자세한 내용은 아래에 있습니다. 기본을 이해하셨다면 건너뛰십시오:

`using` 선언부 두줄은 이름 여역을 가져오므로 굳이 이름을 적어넣을 필요는 없습니다.

`Main` 클래스 생성자에서는 새 창을 만들고 제목을 설정합니다. 그 다음 창을 보여주고, 창을 닫았을 때 어떤 프로그램을 끝낼지 시그널을 연결합니다. 다른 시그널은 나중에 살펴보겠습니다.

정적 `main` 함수는 Vala 프로그램을 실행할 때 기본으로 동작합니다. Main 클래스를 만들고, 섲렁하며, 프로그램을 실행할 몇가지 함수를 호출합니다. `Gtk.Main` 함수는 사용자 인터페이스를 실행하고 이벤트(마우스 단추 누름과 키보드 키 누름) 기다림을 시작하는 GTK 메인 루프를 시작합니다.

이 코드를 사용할 준비가 됐으니 빌드프로젝트 빌드(또는 ShiftF7 키 누름)를 눌러 코드를 컴파일할 수 있습니다.

설정을 기본으로 바꾸고 실행을 눌러 빌드 디렉터리를 설정하십시오. 처음 빌드 때 한 번만 실행하면 됩니다.

# 지스트리머로 웹캠 동영상 스트림 접근하기

지스트리머 멀티미디어 프레임워크는 웹캠 동영상을 처리할 수 있습니다. 동영상 스트림에 접근할 수 있도록 지스트리머를 프로그램에 추가해보겠습니다.

using GLib; using Gtk;

public class Main : Object { private Gst.Element camerabin;

public Main () { this.camerabin = Gst.ElementFactory.make ("camerabin", "camera"); this.camerabin.set_state (Gst.State.PLAYING); }

static int main (string[] args) { Gtk.init (ref args); Gst.init (ref args); var app = new Main ();

Gtk.main ();

return 0; } }

지스트리머에서는 화면에 그림을 띄우는 방법을 다루기 때문에 우선 앞서 만든 창을 제거하겠습니다.

이제 웹 캠에 접근할 지스트리머 이벤트를 만들겠습니다. 일체형 카메라 구성요소이며 사진, 동영상, 효과적용 기능 등이 있는 Camerabin 구성 요소를 활용하겠습니다. 우리가 활용하기에 완벽하죠! 지스트리머 파이프라인에 `this.camerabin.set_state (Gst.State.PLAYING)`로 지스트리머 파이프라인에 재생을 시작할 거리를 만들었다고 알리겠습니다.

물론 동영상을 다른 창에 꽉 붙여둘 수도 있지만, X 윈도우 시스템의 일부 구체적 내용이 들어가는 고급 주제이므로 여기서는 생략하겠습니다.

다시 컴파일하고 실행하십시오. 창 두개가 뜹니다. 다음 단계에서는 GTK+ 창으로 동영상을 통합하겠습니다.

# 참조 구현체

지침서를 따라하는 실행하는 과정에 문제가 있다면, 참조 코드와 여러분의 코드를 비교해보십시오. 일부 고급기술을 넣어 보통 Gtk.Window에 창을 넣고, 사진 표시 시작/정지 단추를 추가한 추가 구현체가 있습니다.

# 더 읽을거리

Vala 프로그래밍 언어에 대해 더 알아보려면 Vala 따라하기 지침서를 확인해보시는게 좋습니다.

# 마무리

다 됐습니다. 15분동안 완전한 기능을 수행하는 웹캠 사진 프로그램을 열심히 만들었습니다. 이제 15분동안 열심히 만든 대단한 프로그램으로 친구나 동료에게 인상을 심어줄 수 있는 일터에서 아름다운 나날을 보내기 전 수염을 깎거나 여러분의 이쁘장한 얼굴을 화장할 수 있습니다.