[Delphi] DirectShow 강좌

2026. 5. 18. 15:07·Programming/Delphi

DirectShow를 이용한 동영상 플레이 시키는 방법을 소개합니다.
Delphi XE 이상에서 컴파일 가능합니다.

 

DirectShow는 마이크로소프트(Microsoft)가 Windows 플랫폼에서 스트리밍 미디어를 제어하기 위해 개발한 멀티미디어 아키텍처입니다. 주로 웹캠이나 캡처 카드의 영상 입력, 오디오/비디오 파일 재생 및 편집 등 고품질 미디어를 캡처하고 처리하는 데 사용됩니다. 

주요 특징

  • 필터 기반 구조(Filter-based Architecture): 미디어 데이터(입력)가 다양한 필터(디코더, 효과, 렌더러 등)를 거쳐 출력되는 흐름(파이프라인)으로 작동합니다.
  • 필터 그래프 매니저(Filter Graph Manager): 각 작업 단계를 수행하는 필터들을 연결하고 제어하여 전체적인 미디어 처리 흐름을 관리합니다. 

핵심 용도

  • 미디어 재생: 동영상 및 오디오 파일의 디코딩 및 고품질 재생.
  • 미디어 캡처: 웹캠, TV 튜너, 화면 녹화 장치로부터 실시간 영상 스트림 캡처. 

준비(폼디자인)

1. 먼저 VCL Forms Application 을 생성합니다.
프로젝트를 저장하고 폼위에 Panel 컴포넌트를 올립니다.
Screen 으로 사용할 패널입니다.
​
Screen Panel의 Caption 을 지우고
Align 프로퍼티를 alClient 로 설정합니다.
그리고 Panel 을 하나 더 올립니다. 버튼올릴 패널입니다.
Caption 을 지우고 Align 프로퍼티를 alBotton으로 설정합니다.

코딩

2. uses 절에 Winapi.DirectShow9, Winapi.ActiveX 를 추가합니다.
3. private 절에 동영상 플레이어에서 사용할 기본 개체를 선언합니다.

FilterGraph: IGraphBuilder; //필터그래프의 인터페이스 중의 하나.
MediaControl: IMediaControl; // 미디어 제어 인터페이스 Play, Stop, Pause.
VideoWindow: IVideoWindow; // 영상 제어 인터페이스

4. Form Create 이벤트에서
CoInitialize(nil); //COM을 초기화한다6. 폼위에 버튼을 올린 후 Click 이벤트에 변수 선언을 한 후

var
  WFileName : Array[0..255] of WideChar;
  PFileName : PWideChar;
begin
  StringToWideChar('재생할 파일경로+파일명',WFileName,255);
  PFileName := @WFileName[0];
 
  // 동영상 파일을 Render 하기
  if FilterGraph.RenderFile(PFileName,nil) = S_OK then begin
    // 영상을 플레이할 패널 지정 Screen = Panel
    VideoWindow.put_Owner(Screen.Handle);
    VideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS or WS_CLIPCHILDREN);
    VideoWindow.SetWindowPosition(0,0,Screen.Width,Screen.Height);
    VideoWindow.put_MessageDrain(Screen.Handle);
 
    MediaControl.Run;
  end;
end;

이제 Panel 위에 재생하려는 영상이 플레이 됩니다.

7. Form Close 이벤트에

// 중지
if Assigned(MediaControl) then MediaControl.Stop;
 
// 비디오 윈도우 해제
If Assigned(VideoWindow) then
Begin
  VideoWindow.put_Visible(false);
  VideoWindow.put_Owner(0);
End;
 
// DirectShow 인터페이스 해제
FilterGraph := nil;
MediaControl := nil;
VideoWindow := nil;

이렇게 코딩합니다.
이렇게 하면 Panel 위에 선택한 동영상이 재생됩니다.

추가기능

8. 열기 버튼 클릭했을때 파일 선택창 나오도록 하기

with TOpenDialog.Create(Self) do 
try 
  Filter := 'Media Files(*.avi;*.mpg;*.wmv;*.mp4)|*.avi;*.mpg;*.wmv;*.mp4;|All Files(*.*)|*.*;'; 
  Title := 'Open Media Files..'; 
  if Execute then begin 
    LoadMedia(FileName); 
  end; 
finally 
  Free; 
end;

9. 미디어 불러오는 코드 프로시져로 변경

procedure TfrmMain.LoadMedia(filename: String); 
var 
  WFileName : Array[0..255] of WideChar; 
  PFileName : PWideChar; 
begin 
  StringToWideChar(filename,WFileName,255); 
  PFileName := @WFileName[0]; 
  // 동영상 파일을 Render 하기 
  if FilterGraph.RenderFile(PFileName,nil) = S_OK then begin 
    // 영상을 플레이할 패널 지정 Screen = Panel 
    VideoWindow.put_Owner(Screen.Handle); 
    VideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS or WS_CLIPCHILDREN); 
    VideoWindow.SetWindowPosition(0,0,Screen.Width,Screen.Height); 
    VideoWindow.put_MessageDrain(Screen.Handle); 
 
    MediaControl.Run; 
    // 재생/일시정지 버튼 상태 
    btnPlayPause.Caption := ''일시정지''; 
  end; 
end;

 

10. 재생/일시정지 토클 버튼 추가

화면에 버튼 컴포넌트를 추가한 후 OnClick 이벤트에

if btnPlayPause.Caption = '일시정지' then begin 
  MediaControl.Pause; 
  btnPlayPause.Caption := '재생' 
end 
else begin 
  MediaControl.Run; 
  btnPlayPause.Caption := '일시정지' 
end;

 

11. 영상을 재생한 후 프로그램을 크기를 바꾸보면 처음 재생했던 패널 크기로만 영상이 재생되는걸

알수 있습니다. 패널 OnResize 이벤트에

if Assigned(VideoWindow) then 
  VideoWindow.SetWindowPosition(0, 0, screen.Width, screen.Height);

 

위와 같이 코딩을 하면 패널 크기가 바뀔때마다 화면 크기를 변경해 줍니다.

이젠 위 화면 같이 트랙바와 라벨컴포넌트를 이용해
타임라인 제어와 재생시간 표시를 해보겠습니다.

12. 트랙바 컨트롤을 화면에 추가합니다.
강좌 9. 에서 만든 LoadMedia 함수에 총재생시간을 구해서 트랙바의 MAX 값과 Min 값을 세팅해줍니다.

//총 재생 시간 구하기 
MediaPosition.get_Duration(MediaLength); 
TrackBar1.Max := trunc(MediaLength); 
TrackBar1.Min := 0;

13. 트랙바 OnChange 이벤트에 아래와 같이 코딩해줍니다.

If Assigned(MediaPosition) then Begin
    // LockTrack 은 Boolean 형의 전역변수임
    if not LockTrack then begin
        // 미디어의 위치를 트랙바위치로 지정
        MediaPosition.put_CurrentPosition(TrackBar1.Position);
    end;
End;

 

14. 타이머 컴포넌트를 하나 추가하고 OnTimer 이벤트에

var
    CurPos : Double;
begin
    If Assigned(MediaPosition) then Begin
        MediaPosition.get_CurrentPosition(CurPos);
        Label1.Caption := Format('%s', [SecondToTimeStr(CurPos)]);
        
        LockTrack := true;
        TrackBar1.Position := trunc(CurPos);
        LockTrack := false;
    End;
end;

 

LockTrack 전역변수를 사용하는 이유는 타이머 이벤트에서 트랙바 포지션을 바꿀때 OnChange 이벤트를 타지 않게 하기 위해서

15. SecontToTimeStr 함수 만들기

function TfrmMain.SecondToTimeStr(Sec: Double): string;
var
    H, M, S: Integer;
begin
    H := Trunc(Sec) div 3600;
    M := (Trunc(Sec) - H * 3600) div 60;
    S := Trunc(Sec) - H * 3600 - M * 60;
    Result := Format('%d:%d:%d', [H, M, S]);
end;
// 현재 값을 받아서 시:분:초 로 표시

 

이상입니다. 실제 구현한 소스코드는 아래 github에 공개해 놓았습니다.

기초적인 소스니 필요하신 분은 이용하시길 바라요!!!

그리고 동영상 플레이어 강좌지만 파일 열기에서 mp3를 선택하면 mp3가 플레이 됩니다. ㅎㅎ


github 소스링크

https://github.com/skshpapa80/BasePlayer

 

GitHub - skshpapa80/BasePlayer: DirectShow 기본 동영상 재생기 Basic Movie Player

DirectShow 기본 동영상 재생기 Basic Movie Player. Contribute to skshpapa80/BasePlayer development by creating an account on GitHub.

github.com

 

'Programming > Delphi' 카테고리의 다른 글

[Delphi] 진법변환 (16->10, 10->2, 2->16. 10->8, 2->8)  (0) 2026.05.21
[Delphi] SAPI 컴포넌트 등록 방법(TTS 구현)  (0) 2026.05.20
[Delphi] ShellContols 컴포넌트 등록법  (0) 2026.05.15
[Delphi] 웹프로그래밍 #4 - 게시판 만들기  (0) 2026.05.13
[Delphi] 웹프로그래밍 #3 - 코딩 심화  (0) 2026.05.12
'Programming/Delphi' 카테고리의 다른 글
  • [Delphi] 진법변환 (16->10, 10->2, 2->16. 10->8, 2->8)
  • [Delphi] SAPI 컴포넌트 등록 방법(TTS 구현)
  • [Delphi] ShellContols 컴포넌트 등록법
  • [Delphi] 웹프로그래밍 #4 - 게시판 만들기
레이조(RayCho)
레이조(RayCho)
개발자 레이조(RayCho)의 블로그입니다. 똑똑하게 배우고 기록하는 공간
  • 레이조(RayCho)
    레이(Ray)의 개발이야기
    레이조(RayCho)
  • 전체
    오늘
    어제
    • 분류 전체보기 (53) N
      • Programming (53) N
        • Python (5)
        • Flutter (4)
        • Delphi (20) N
        • Lazarus (1)
        • C#.NET (5)
        • ASP.NET (5)
        • Database (5)
        • Game Dev (0)
        • Web (5)
        • ETC (3)
      • Homebrew (0)
  • 블로그 메뉴

    • 홈
    • Introduce
    • 태그
    • 방명록
  • 링크

    • Naver Blog
    • Diary Blog
  • 공지사항

  • 인기 글

  • 태그

    objectpascal
    Web
    JSON
    프로그래밍
    개발환경
    delphi
    VCL
    SQL
    문법
    기초
    mssql
    C#
    웹프로그래밍
    ASP.NET
    델파이
    Python
    iis
    소스코드
    강좌
    Flutter
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
레이조(RayCho)
[Delphi] DirectShow 강좌
상단으로

티스토리툴바