2013년 3월 15일 금요일

델파이 3장 - 2

동영상 재생기를 만들어 보겠다.
많은 삽질 끝에 성공했다 -_-
먼저 폼을 만들어 보자.
아래와 같이 만들자.



  1. 패널 3개를 넣고 Align 속성을 altop, alClient, alBottom 으로 나눈다.
  2. TStatusBar 컴포넌트 넣고, 팝업메뉴에서 Panel Editor를 선택하고 1개 추가한다.
  3. 버튼 2개를 넣고 각각 Open, Exit 로 속성을 변경한다.
  4. TMediaPlayer 컴포넌트를 패널1에 넣고, 속성은 Display는 Panel2로 설정
  5. TTrackBar컴포넌트를 패널2에 넣고 속성은 Align은 alBottom으로 설정
  6. 패널3에 라벨를 넣고 위 그림과 같이 Caption 속성을 입력한다.
  7. 패널3에 패널 하나 더 넣고 BevelOuter를 bvLowered로 지정한다.
  8. TOpenDialog와 TTimer컴포넌트를 넣는다.
아래는 완성된 코드다.
---------------------------------------------------------------------------------

unit UVideo;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.ComCtrls,
  Vcl.StdCtrls, Vcl.MPlayer, Vcl.Buttons;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    MediaPlayer1: TMediaPlayer;
    Panel2: TPanel;
    Panel3: TPanel;
    TrackBar1: TTrackBar;
    StatusBar1: TStatusBar;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    mPlayFrame: TLabel;
    mTotalFrame: TLabel;
    mTime00: TLabel;
    mTime01: TLabel;
    mFileName: TPanel;
    OpenDialog1: TOpenDialog;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure MediaPlayer1Click(Sender: TObject; Button: TMPBtnType;
      var DoDefault: Boolean);
    procedure MediaPlayer1Notify(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  h,m,s,ss : integer;
begin
  if OpenDialog1.Execute then
  begin
    //열기 대화 상자에서 선택한 동영상 파일을 미디어 플레이어의 FileName 속성에 대입하여 연결
    MediaPlayer1.FileName := OpenDialog1.FileName;
    //경로명과 파일명을 가지고 있는 문자열에서 파일명과 확장자명만을 축출하는 함수
    mFileName.Caption := ExtractFileName(OpenDialog1.FileName);
    //재생할 동영상을 연결
    Mediaplayer1.Open;
    mediaPlayer1.TimeFormat := tfFrames;
    //전체 프레임 수를 표시
    TrackBar1.Max := MediaPlayer1.Length;
    //현재 재생 위치를 표시
    TrackBar1.Position := MediaPlayer1.Position;
    mTotalFrame.Caption := FormatFloat('##,###,###,###,##0',MediaPlayer1.Length);
    mPlayFrame.Caption := FormatFloat('##,###,###,###,##0',MediaPlayer1.Position);
    MediaPlayer1.TimeFormat := tfMilliseconds;
    ss := MediaPlayer1.Length div 1000;
    s := ss mod 60;
    m := ss div 60;
    h := m div 60;
    m := m mod 60;
    mTime00.Caption := FormatFloat('00:00:00',0);
    mTime01.Caption := FormatFloat('00',h)+':'+FormatFloat('00',m)+':'+FormatFloat('00',s);
  end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OpenDialog1.Filter := 'Avi Files|*.avi|MPEG Files|*.mpg|All Files|*.*';
  mPlayFrame.Caption := '0';
  mTotalFrame.Caption := '0';
  mTime00.Caption := '00:00:00';
  mTime01.Caption := '00:00:00';
end;

procedure TForm1.MediaPlayer1Click(Sender: TObject; Button: TMPBtnType;
  var DoDefault: Boolean);
begin
  case Button of
    btPlay: begin
              Timer1.Enabled := true;
              StatusBar1.Panels[0].Text := '재생';
            end;
    btPause: StatusBar1.Panels[0].Text := '잠시멈춤';
    btStop: StatusBar1.Panels[0].Text := '재생중지';
    btNext: StatusBar1.Panels[0].Text := '다음';
    btPrev: StatusBar1.Panels[0].Text := '이전';
    btStep: StatusBar1.Panels[0].Text := '앞으로';
    btBack: StatusBar1.Panels[0].Text := '뒤로';
  end;
end;

procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
  if (MediaPlayer1.NotifyValue = nvSuccessful) and (MediaPlayer1.Mode = mpStopped) then
    StatusBar1.Panels[0].Text := '재생완료';
  if MediaPlayer1.Mode = mPStopped then
    StatusBar1.Panels[0].Text := '재생중지';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  h,m,s,ss : integer;
begin
  MediaPlayer1.TimeFormat := tfFrames;
  mPlayFrame.Caption := FormatFloat('##,###,###,###,##0',MediaPlayer1.Position);
  TrackBar1.Position := MediaPlayer1.Position;
  MediaPlayer1.TimeFormat := tfMilliseconds;
  ss := MediaPlayer1.Position div 1000;
  s := ss mod 60;
  m := ss div 60;
  h := m div 60;
  m := m mod 60;
  mTime00.Caption := FormatFloat('00',h)+':'+FormatFloat('00', m)+ ':' + FormatFloat('00',s);
  Timer1.Enabled := true;
end;

end.

---------------------------------------------------------------------------------
역시 빨강 부분은 폼을 완성하면서 자동으로 추가된 코드고
주황 부분이 직접 넣어야 하는 부분이다.
실행해보니 코덱의 문제인지 소리만 나는 영상도 있고, 나오는 영상도 있고, 안나오는 영상도 있다 ㅡㅡ;;
어째든 이번 장도 끝~ ㅎㅎ;; ㅌㅌㅌ



댓글 없음:

댓글 쓰기