[카테고리:] 미분류

  • AForge.NET 카메라

    AForge.NET을 활용해 카메라(웹캠)에서 실시간 영상을 가져오다 보면, 많은 분들이 “왜 다른 프로그램에서 동시에 같은 카메라를 쓸 수 없지?”라는 궁금증을 갖게 됩니다. 이 문제는 기술적으로는 ‘장치 독점(Exclusive Access)’이라는 개념과 관련이 깊습니다. 기본적으로 DirectShow나 윈도우 드라이버에서 카메라를 점유할 때, 하나의 프로세스에서 이미 사용 중인 장치를 다른 프로세스가 동시에 잡기 어렵도록 막아버리는 것이죠. 처음에는 이 문제가 꽤 난감하게 느껴집니다. 왜냐하면 “단순히 영상을 복제해서 다른 프로그램에도 보여주면 되지 않을까?”라고 생각하기 쉽지만, 실제 장치 수준에서의 점유는 그렇게 간단히 공유가 되지 않기 때문입니다. 저도 이 점 때문에 꽤 애를 먹은 기억이 있습니다.

    개인적으로 AForge.NET을 많이 사용해오면서, “한 대의 웹캠에서 받아오는 영상을 여러 프로그램에서 동시에 쓰고 싶다”라는 요구사항을 여러 번 접하게 되었는데요. 가장 안타까운 점은 “단순히 VideoCaptureDevice 객체를 하나 더 만들면 되지 않을까”라고 쉽게 생각했다가, 여지없이 카메라 장치 충돌이 발생한다는 것입니다. 이는 Windows 운영체제 자체에서 하드웨어 점유를 한 번에 하나로 제한해버리기 때문에 어쩔 수 없는 부분이죠. 특히 오디오 장치 등은 일부 예외적으로 공유가 잘 되기도 하지만, 영상 장치는 제조사 드라이버나 DirectShow 레벨에서 거의 예외 없이 독점 모드가 적용되기 마련입니다.

    이 문제를 해결하기 위해 제가 주로 추천하는 방법들을 말씀드리겠습니다.

    첫 번째 방법은 ‘가상 카메라(Virtual Camera)’ 사용입니다. OBS, ManyCam, SplitCam 같은 프로그램이 대표적인 예입니다. 원리는 간단합니다. 실제 웹캠으로부터 받은 영상을 가상으로 에뮬레이션된 ‘가짜’ 카메라 장치로 뿌려주고, 다른 모든 프로그램에서는 이 가상 장치를 선택하게 만드는 것이죠. 결과적으로 실제 물리 카메라는 하나만 점유하지만, 여러 프로그램은 “이건 각각 다른 카메라”라고 생각하고 동시에 영상을 받아올 수 있습니다. 제가 보기에는 이것이 가장 사용자 친화적이고 간단한 솔루션입니다. 직관적으로 설치만 하면 되고, 인터페이스도 친절한 경우가 많기 때문입니다. 다만 무료 버전에서는 워터마크가 뜨거나 해상도 제한이 걸릴 수 있다는 점이 조금 아쉽기는 합니다. 그래도 빠르고 편하게 해결하기에는 가상 카메라 솔루션이 확실히 좋아 보입니다.

    두 번째 방법은 스트리밍 서버(예: MJPEG 서버) 구성입니다. “내가 찍은 영상을 웹서버 형태로 뿌리고, 다른 프로그램들은 그 스트림을 받아오면 되지 않을까?”라는 발상인데요. 가령 MJPEG나 RTSP 같은 형식으로 실시간 영상을 네트워크 스트리밍 형태로 만들어놓고, 그 주소로 접속하면 여러 대의 클라이언트가 같은 영상을 동시에 시청할 수 있습니다. 이런 식이라면 운영체제가 장치를 독점해도 상관없이, 카메라가 제공하는 단일 영상을 여러 곳에서 받아쓸 수 있습니다. 하지만 이를 구현하려면 MJPEG 서버 라이브러리나 직접 소켓 프로그래밍 등을 다뤄야 해서, 초보자분들에게는 다소 어렵게 느껴질 수 있습니다. 그래도 “웹 브라우저나 플레이어에서 언제 어디서든 접근”이라는 자유도가 큰 장점이 있습니다. 개인적으로는 프로젝트가 조금 규모가 있거나, 네트워크를 통한 다중 접속 환경이 필요하다면 이 방법이 확실히 매력적이라고 생각합니다.

    세 번째 방법은 DirectShow 자체에서 ‘중간 분배(Tee)’ 필터 등을 통해 재중계를 하는 방식입니다. 이는 고급 사용자나 DirectShow 필터 체인에 대해 깊이 이해가 있는 분들이 시도해볼 만한 방법인데요. 쉽게 말해 “하나의 영상 스트림을 가져오되, 중간 필터가 그 스트림을 복제해서 여러 Output Pin으로 나눠주고, 각각을 다른 프로그램에서 받아갈 수 있게끔” 만드는 것입니다. 이건 사실상 가상 카메라가 내부적으로 하는 일과 유사하다고 볼 수 있는데, 직접 필터 그래프를 구성하고 레지스트리를 손대야 할 수도 있어서, 난이도가 꽤 있습니다. 그래도 커스텀으로 직접 구축하면 원하는 기능을 세밀하게 제어할 수 있는 장점이 있습니다. 저는 한때 이 방법으로 직접 필터 그래프를 만든 경험이 있는데, 디버깅 과정에서 그래프가 엉켜서 몇 번이고 재부팅한 기억도 있습니다. 처음엔 어렵지만, 익숙해지면 나름 재미있는 영역입니다.

    이처럼 AForge.NET으로 웹캠을 캡처할 때 발생하는 장치 독점 문제는, 단순히 “코드를 조금 수정하면 해결된다”가 아니라 “장치 레벨에서의 사용 권한 제한을 어떻게 우회나 공유로 만들 것인가”라는 관점에서 접근해야 합니다. 개인적으로는 사용하는 목적과 환경에 따라 해법이 조금씩 달라진다고 느낍니다. 간단하게 여러 프로그램에서 동시에 화면을 공유하고 싶다면 가상 카메라를 설치하는 것이 빠르고 편합니다. 업무적으로나 프로젝트 차원에서, 여러 클라이언트에게 영상 뷰어를 동시에 제공하고 싶다면 스트리밍 서버 방식을 고려해볼 만합니다. 그리고 DirectShow에 친숙하고, 프로젝트 요구사항이 “정말 특정한 필터 체인을 만들어야 한다” 수준으로 깊다면 Tee 필터를 직접 구성하는 고급 방법에 도전해볼 수도 있습니다.

    정리하자면, AForge.NET 혹은 DirectShow 환경에서 카메라 장치를 동시에 두 곳 이상에서 쓰는 것은 기본적으로 불가능합니다. 그러나 가상 장치나 스트리밍 기법, 혹은 분배 필터 같은 중간 단계를 두면 “같은 영상을 복제해서 여러 곳으로 보내는 방식”이 가능합니다. 제가 보기에는 이 문제가 자주 제기되는 이유가, 많은 분들이 “코드 한 줄만 추가하면 되지 않을까?” 하는 기대를 갖기 때문인 것 같습니다. 하지만 실제 하드웨어와 운영체제, 드라이버 레벨에서의 제약이 있기 때문에, 반드시 별도의 솔루션을 사용해 공유 구조를 만들어야 합니다. 이 점을 이해하고 나면, 오히려 “아, 그래서 저 많은 가상 카메라 프로그램들이 있었구나”라는 깨달음도 오게 되죠.

    개인적인 경험상, 가상 카메라 솔루션이 가장 쉬운 편이어서 처음에는 저도 OBS나 ManyCam 같은 툴을 많이 썼고, 이후에는 스트리밍 서버 구성에도 흥미를 느껴 몇 가지 오픈소스 라이브러리를 사용해보기도 했습니다. 결국 최종 선택은 “현재 상황에서 가장 쉽고 빠르고 효과적인 방법은 무엇인가?”라는 데 달려 있다고 봅니다. 굳이 어려운 방법을 택할 필요는 없다고 생각합니다. 어떤 방법을 쓰든 결과적으로는 “하나의 물리 장치로부터 들어오는 영상을 어떻게 여러 곳에 나눠줄 것인가”라는 문제를 해결하는 것이니까요.

    요약하면, AForge.NET을 사용하면서 카메라를 캡처할 때 만나는 장치 독점 문제는 다음 세 가지 방법으로 우회/해결할 수 있습니다.

    1. 가상 카메라(Virtual Camera)를 활용
    2. 스트리밍 서버(MJPEG 등)로 영상을 브로드캐스트
    3. DirectShow Tee 필터 등으로 영상 분배

    어떤 방법이든 궁극적으로 목적은 “실제 장치를 독점하는 대신, 그 영상을 여러 곳에서 동시에 받아볼 수 있도록 하자”에 있으므로, 상황에 맞춰 적절히 선택하시면 좋겠습니다. AForge.NET으로 프로젝트를 진행하다가 같은 문제를 만나 고민하고 계신 분들에게 이 글이 조금이나마 도움이 되었으면 합니다.