C# - VLC(ActiveX) 컨트롤을 레지스트리 등록 없이 사용하는 방법
VLC media player가 ActiveX 인터페이스를 제공하고 있군요. ^^
VLC Documentation: ActiveX
; https://wiki.videolan.org/ActiveX/
VLC ActiveX를 사용하는 방법은 아래의 Youtube 강좌에서 자세하고 다루고 있으니 제가 굳이 재탕할 필요는 없겠습니다.
Using the VLC ActiveX control in WPF
; http://www.youtube.com/watch?v=cGc_ra9CsLI
대신 ^^ 이전에 소개했던 방법을 이용해서,
Registry 등록 없이 COM 개체 사용
; https://www.sysnet.pe.kr/2/1/262
Registry 등록 과정 없이 COM 개체 사용 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/1167
ClickOnce로 ActiveX를 같이 배포하는 방법
; https://www.sysnet.pe.kr/2/0/692
VLC 프로그램을 설치하지 않고도 파일 복사만으로 구동이 되도록 해보겠습니다. ^^
일단 VLC 원본 파일이 필요하기 때문에 별도로 설치해 둔 가상 머신에 VLC를 설치했습니다. 그랬더니, C:\Program Files (x86)\VideoLAN\VLC 폴더에 바이너리가 위치했고
Using the VLC ActiveX control in WPF 글에 따라 "VLC ActiveX Plugin and IE Web Plugin v2" 컨트롤을 테스트 WinForm 프로그램에 올려놓고 간단하게 잘 실행이 되는 것을 확인했습니다.
private void Form1_Load(object sender, EventArgs e)
{
this.axVLCPlugin21.playlist.add(@"...[URL]...");
this.axVLCPlugin21.playlist.play();
}
실행된 상태에서 Process Explorer를 통해 로드된 VLC 바이너리 목록을 보면, 루트의 axvlc.dll, libvlc.dll, libvlccore.dll들이 올라와 있었고 나머지는 모두 그 하위의 plugins에 있는 것들이 사용되는 것을 확인했습니다. 그 목록에 포함된 디렉토리를 기준으로 모두 포함시켜 보면 총 42MB의 용량이 나오는데 압축해도 19MB나 됩니다. 즉, VLC ActiveX를 쓰는 것만으로 응용 프로그램의 용량이 20MB는 넘는다고 보시면 됩니다.
자, 그럼 reg-free로 사용해 볼까요? ^^
이를 위해 가장 중요한 axvlc.dll.manifest 파일을 다음과 같이 만들어 주어야 합니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="2.1.3.0" processorArchitecture="x86"
name="axvlc.dll" type="win32">
</assemblyIdentity>
<file name="axvlc.dll">
<comClass clsid="{E23FE9C6-778E-49D4-B537-38FCDE4887D8}" threadingModel="Apartment">
</comClass>
<comClass clsid="{9BE31822-FDAD-461B-AD51-BE1D1C159921}" threadingModel="Apartment">
</comClass>
<typelib tlbid="{DF2BBE39-40A8-433B-A279-073F48DA94B6}" version="1.0"
helpdir="VLC 1.0 Type Library">
</typelib>
</file>
<comInterfaceExternalProxyStub name="IVLCControl"
iid="{C2FA41D0-B113-476E-AC8C-9BD14999C1C1}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{DF2BBE39-40A8-433B-A279-073F48DA94B6}">
</comInterfaceExternalProxyStub>
<comInterfaceExternalProxyStub name="IVLCAudio"
iid="{9E0BD17B-2D3C-4656-B94D-03084F3FD9D4}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{DF2BBE39-40A8-433B-A279-073F48DA94B6}">
</comInterfaceExternalProxyStub>
<comInterfaceExternalProxyStub name="IVLCInput"
iid="{49E0DBD1-9440-466C-9C97-95C67190C603}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{DF2BBE39-40A8-433B-A279-073F48DA94B6}">
</comInterfaceExternalProxyStub>
<comInterfaceExternalProxyStub name="IVLCLogo"
iid="{8A4A20C2-93F3-44E8-8644-BEB2E3487E84}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{DF2BBE39-40A8-433B-A279-073F48DA94B6}">
</comInterfaceExternalProxyStub>
<comInterfaceExternalProxyStub name="IVLCDeinterlace"
iid="{BC97469F-CB11-4037-8DCE-5FC9F5F85307}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{DF2BBE39-40A8-433B-A279-073F48DA94B6}">
</comInterfaceExternalProxyStub>
<comInterfaceExternalProxyStub name="IVLCMarquee"
iid="{8D076AD6-9B6F-4150-A0FD-5D7E8C8CB02C}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{DF2BBE39-40A8-433B-A279-073F48DA94B6}">
</comInterfaceExternalProxyStub>
<comInterfaceExternalProxyStub name="IVLCPlaylist"
iid="{54613049-40BF-4035-9E70-0A9312C0188D}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{DF2BBE39-40A8-433B-A279-073F48DA94B6}">
</comInterfaceExternalProxyStub>
<comInterfaceExternalProxyStub name="IVLCPlaylistItems"
iid="{FD37FE32-82BC-4A25-B056-315F4DBB194D}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{DF2BBE39-40A8-433B-A279-073F48DA94B6}">
</comInterfaceExternalProxyStub>
<comInterfaceExternalProxyStub name="IVLCSubtitle"
iid="{465E787A-0556-452F-9477-954E4A940003}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{DF2BBE39-40A8-433B-A279-073F48DA94B6}">
</comInterfaceExternalProxyStub>
<comInterfaceExternalProxyStub name="IVLCVideo"
iid="{0AAEDF0B-D333-4B27-A0C6-BBF31413A42E}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{DF2BBE39-40A8-433B-A279-073F48DA94B6}">
</comInterfaceExternalProxyStub>
<comInterfaceExternalProxyStub name="IVLCControl2"
iid="{2D719729-5333-406C-BF12-8DE787FD65E3}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{DF2BBE39-40A8-433B-A279-073F48DA94B6}">
</comInterfaceExternalProxyStub>
<comInterfaceExternalProxyStub name="IVLCMediaDescription"
iid="{796A2C2D-5B11-4FB5-9077-56D5E674972B}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{DF2BBE39-40A8-433B-A279-073F48DA94B6}">
</comInterfaceExternalProxyStub>
</assembly>
나머지 절차는 간단하지요. ^^ .manifest 파일을 기존 윈폼 프로젝트에 포함시키고 빌드합니다. 물론 빌드된 결과 폴더에 VLC 파일들을 함께 복사해 주어야 합니다. 이제 다음과 같이 해당 파일들을 그대로 대상 PC에 복사하면 정상적으로 동영상이 VLC ActiveX 컨트롤 안에서 보여지는 것을 확인할 수 있습니다. ^^
완성된 예제 파일은 다음에 올려두었으니 참고하세요. ^^
reg_free_vlc
; https://github.com/stjeong/reg_free_vlc
그냥 다운로드 받으셔서 Visual Studio에 로드한 다음 빌드하면 곧바로 VLC ActiveX 예제가 실행됩니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]