Универсальный проигрыватель MediaPlayer

Универсальный проигрыватель MediaPlayer в среде Delphi

 

Выполнил студент группы 50-201С:

Гогия Константин

 

 

Москва

2016г.

Универсальный проигрыватель MediaPlayer

В Delphi (начиная с Delphi 2) имеется компонент MediaPlayer — универсальный проигрыватель аудио- и видео-информации. Этот медиа-плеер расположен на странице System библиотеки компонентов.

Медиа-плейер может управляться как кнопками, так и непосредственно соответствующими этим кнопкам методами (Play, Pause, Stop, Next, Previous, Step, Back, StartRecording, Eject). В этом случае сам компонент TMediaPlayerможет быть сделан невидимым. Т.е. компонент делается невидимым, а управление воспроизведением происходит не по нажатию на кнопки самого компонента, а вызывая нужные методы в нужных местах, например можно сделать чтобы по нажатию на кнопку TButton воспроизведение остановилось.

Пользовательский интерфейс медиа-плеера представлен на рисунке ниже. Он имеет ряд кнопок, управляемых мышью или клавишей пробела и клавишами со стрелками.

Назначение кнопок (перечисляются слева направо):

Кнопка Действие
Play Воспроизведение
Pause Пауза воспроизведения или записи. Если медиа-плеер в момент щелчка уже в состоянии паузы, то воспроизведение или запись возобновляются
Stop Останов воспроизведения или записи
Next Переход на следующий трек или на конец
Prev Переход на предыдущий трек или на начало
Step Перемещение вперед на заданное число кадров
Back Перемещение назад на заданное число кадров
Record Начало записи
Eject Освобождение объекта, загруженного в устройство

 

Каждой кнопке медиа-плеера соответствует метод, осуществляющий по умолчанию требуемую операцию: Play, Pause, Stop, Next, Previous, Step, Back, StartRecording, Eject.

Тип устройства мультимедиа, с которым работает медиа-плеер, определяется его свойством DeviceType. Если устройство мультимедиа хранит объект воспроизведения в файле, то имя файла задается свойством FileName. По умолчанию свойство DeviceType имеет значение dtAutoSelect. Это означает, что медиа-плеер пытается определить тип устройства исходя из расширения имени файла FileName.

Еще одно свойство MediaPlayerAutoOpen. Если оно установлено в true, то медиа-плеер пытается открыть устройство, указанное свойством DeviceType, автоматически во время своего создания в процессе выполнения приложения.

Воспроизведение видео информации по умолчанию производится в окно, которое создает само открытое устройство мультимедиа. Однако это можно изменить, если в свойстве Display указать оконный элемент, в котором должно отображаться изображение. Это может быть, например, форма или панель. Можно также задать в свойстве DisplayRect типа TRect (свойство только времени выполнения) прямоугольную область этого окна, в которую должно выводиться изображение. Для задания свойства DisplayRect можно использовать функцию Rect. Однако, в данном свойстве использование типа TRect не совсем обычно. Первые две координаты, как и обычно, задают положение левого верхнего угла изображения. А два следующих числа задают ширину и высоту изображения, а не координаты правого нижнего угла.

Например, оператор:

MediaPlayer1.DisplayRect := Rect(10, 10, 200, 200); -

 

задает для вывода область с координатами левого верхнего угла (10, 10), длиной и шириной, равными 200.

Рассмотрим основные свойства:

AutoEnable - Автоматическое задание доступных и не доступных кнопок в зависимости от режима Mode;

AutoOpen- Определяет автоматический запуск медиа-плейера в момент начала выполнения приложения;

AutoRewind- Автоматическая перемотка. Если AutoRewind установлено в true и текущая позиция соответствует концу, то перед выполнением Play или StartRecording производится перемещение текущей позиции в начало перед воспроизведением или записью. При AutoRewind установленном в false, перемотка должна осуществляться пользователем кнопкой Prev или программно методом Previous. Если заданы значения StartPos или EndPos, или если устройство использует треки, свойство AutoRewind не работает;

Display- Определяет окно, используемое для вывода;

DisplayRect - Определяет область отображения в окне, указанном свойством Display;

EnabledButtons- Определяет доступные кнопки;

FileName- Определяет имя файла, открываемого методом Open или сохраняемого методом Save;

Position- Указывает текущую позицию в загруженном объекте в соответствии с форматом TimeFormat. По умолчанию позиция в начале объекта или в начале первого трека;

VisibleButtons- Указывает, какие кнопки медиа-плейера видимы. По умолчанию видимы все кнопки. Кнопки, не перечисленные в множестве VisibleButtons типа TButtonSet, невидимы.

 

Помимо свойств, которые доступы в процессе разработки, компонент MediaPlayer представляет свойства, которые доступны во время работы программы позволяющие получить информацию о состоянии MediaPlayer, воспроизводимом файле или треке CD: работы программы

Length Длина открытого файла
Tracks Количество треков на устройстве
TrackLength Длина треков
Position Позиция (время воспроизведения)
TimeFormat Формат представления значений свойств Length, TrackLength и Position. Наиболее универсальным является формат tfMilliseconds
Mode Состояние устройства воспроизведения. mpPlaying — состояние воспроизведения; mpStopped – процесс остановлен; mpPaused — приостановлен; mpNotReady — не готово к работе; mpOpen – в устройстве (CD-деске) отсутствует носитель.
Display Экран, на котором отображается клип. Если значение не задано, то клип отображается в отдельном окне (создаваемом во время работы программы)
DisplayRect Размер и положение области отображения клипа на поверхности экрана

 

Задание:

Показать возможности компонента MediaPlayer на примере создание видеоплейера.

Начальный вид Form1(Media WMV Player):

В плеере используются следующие компоненты:

Media WMV Player:

DisplayPlayer: TPanel;

Panel1: Tpanel.

 

На DisplayPlayer: TPanel расположены компоненты:

MediaPlayer: TMediaPlayer;

OpenDialog: TOpenDialog;

Timer: TTimer;

TimerResize: TTimer;

На Panel1: Tpanel расположены компоненты:

Edit1: TEdit;

Label1: TLabel;

ProgressBar1: TProgressBar;

TrackBar1: TTrackBar;

PlayButton: TButton;

PauseButton: TButton;

StopButton: TButton;

OpenButton: TButton;

 

 

Пример пошагового использования готовой программы на примере открытия видео-файла:

1. Нажимаем кнопку “Открыть”.

Открывается список файлов – выбираем нужный, после чего нажимаем кнопку “Открыть”. Используется компонент OpenDialog;

2. Начнётся воспроизведение. Для того, чтобы поставить фильм на паузу, нажимаем кнопку “Пауза”. Используется компонент PauseButton;

 

 

 

3. Кнопка “Играть” снова продолжит воспроизведение. Используется компонент PlayButton;

4. Кнопка “Стоп” остановит произведение файла, после чего нужно снова будет выбрать файл для воспроизведения. Продолжить воспроизведение текущего фильма после нажатия данной кнопки уже нельзя. Используется компонент StopButton;

 

В Label1 – будет отображаться текущее время(слева) и общее время(справа) фильма;

В Edit1 – отображается название фильма и его расширения(формат);

ProgressBar – этот компонент предназначен для отображения хода процесса, занимающих заметное время, например копирование больших файлов, настройку и установку приложений на компьютер и прочее. С его помощью(при нажатии на нужную область) мы можем мгновенно перейти на любой момент фильма

 

 

5. В строке ProgressBar1 можно перейти на любой момент времени в фильме

 

6. С помощью ползунка TrackBar1 можно регулировать уровень звука в фильме.

Компонент TrackBar представляет собой элемент управления в виде ползунка, который пользователь может перемещать курсором мыши или клавишами во время выполнения. Таким образом, пользователь может управлять какими-то процессами: громкостью звука, размером изображения и т.п.

 

 

 

Примечание:

Данный проигрыватель может проигрывать видео-файлы форматов: wmv, mp4, avi;

и аудио-файлы форматов: wma, mp3.

Если видео форматов avi и mp4 закодировано с помощью библиотек сжатия видео DivX, Xvid, QuickTime, то для корректного воспроизведения нужно скачать кодеки для этих форматов на компьютер(если их нет).

Форматы видео и аудио высокого качества, такие как: mkv, m2ts, flac, Apple Lossless – не поддерживаются, так как их поддержки нет в самом Delphi.

 

Текст программы:

unit MediaWMV;

 

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, MPlayer, StdCtrls, ComCtrls, mmsystem;

const

WMVOpenDialogTypes = 'Windows Media Files (WMV WMA MP3 WAV MP4 AVI MKV FlAC) |*.wmv;*.wma;*.mp3;*.wav;*.avi;*.mkv;*.flac;*.mp4';

b_time_rz = ':';

audio = 'Audio File';

 

const

MCI_SETAUDIO = $0873;

MCI_DGV_SETAUDIO_VOLUME = $4002;

MCI_DGV_SETAUDIO_ITEM = $00800000;

MCI_DGV_SETAUDIO_VALUE = $01000000;

MCI_DGV_STATUS_VOLUME = $4019;

 

type

 

MCI_DGV_SETAUDIO_PARMS = record

dwCallback: DWORD;

dwItem: DWORD;

dwValue: DWORD;

dwOver: DWORD;

lpstrAlgorithm: PChar;

lpstrQuality: PChar;

end;

 

MCI_STATUS_PARMS = record

dwCallback: DWORD;

dwReturn: DWORD;

dwItem: DWORD;

dwTrack: DWORD;

end;

 

TPanel = class (ExtCtrls.TPanel)

public

property Canvas;

end;

 

TWMVPlayer = class(TForm)

MediaPlayer: TMediaPlayer;

Panel1: TPanel;

DisplayPanel: TPanel;

ProgressBar1: TProgressBar;

Label1: TLabel;

PlayButton: TButton;

PauseButton: TButton;

StopButton: TButton;

OpenButton: TButton;

OpenDialog: TOpenDialog;

Timer: TTimer;

TimerResize: TTimer;

Edit1: TEdit;

TrackBar1: TTrackBar;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure TrackBar1Change(Sender: TObject);

procedure ProgressBar1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure StopButtonClick(Sender: TObject);

procedure TimerResizeTimer(Sender: TObject);

procedure FormResize(Sender: TObject);

procedure OpenButtonClick(Sender: TObject);

procedure PauseButtonClick(Sender: TObject);

procedure PlayButtonClick(Sender: TObject);

procedure TimerTimer(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

Loaded: boolean;

Played: boolean;

function Rvol: integer;

procedure Wvol(const Value: integer);

procedure Load(filename: string);

public

{ Public declarations }

procedure Play(filename:string = '');

procedure Pause;

function SecondsToTime(sec: double): String;

procedure Stop;

function GetAllPlayFiles(StartDir:string):TStringList;

// 0 - 1000;

property Volume: integer Read Rvol Write Wvol;

end;

 

var

WMVPlayer: TWMVPlayer;

 

function GetMPVolume(MP: TMediaPlayer): Integer;

procedure SetMPVolume(MP: TMediaPlayer; Volume: Integer);

 

 

implementation

 

{$R *.dfm}

 

procedure SetMPVolume(MP: TMediaPlayer; Volume: Integer);

var

p:MCI_DGV_SETAUDIO_PARMS;

begin

p.dwCallback := 0;

p.dwItem := MCI_DGV_SETAUDIO_VOLUME;

p.dwValue := Volume;

p.dwOver := 0;

p.lpstrAlgorithm := nil;

p.lpstrQuality := nil;

mciSendCommand(MP.DeviceID, MCI_SETAUDIO,

MCI_DGV_SETAUDIO_VALUE or MCI_DGV_SETAUDIO_ITEM, Cardinal(@p));

end;

 

function GetMPVolume(MP: TMediaPlayer): Integer;

var

p: MCI_STATUS_PARMS;

begin

p.dwCallback := 0;

p.dwItem := MCI_DGV_STATUS_VOLUME;

mciSendCommand(MP.DeviceID, MCI_STATUS, MCI_STATUS_ITEM, Cardinal(@p));

Result := p.dwReturn;

{ Volume: 0 - 1000 }

end;

 

procedure TWMVPlayer.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Stop;

end;

 

procedure TWMVPlayer.FormCreate(Sender: TObject);

begin

Loaded:=false;

Played:=false;

OpenDialog.Filter:=WMVOpenDialogTypes;

DoubleBuffered:=true;

end;

 

procedure TWMVPlayer.FormResize(Sender: TObject);

begin

if Loaded then TimerResize.Enabled:=true;

end;

 

function TWMVPlayer.GetAllPlayFiles(StartDir: string): TStringList;

var

SearchRec: TSearchRec; ext: string;

begin

result:=TStringList.Create;

if StartDir[Length(StartDir)] <> '\' then

StartDir := StartDir + '\';

if FindFirst(StartDir + '*.*', faAnyFile, SearchRec) = 0 then begin

repeat Application.ProcessMessages;

if ((SearchRec.Attr and faHidden) = faHidden) or ((SearchRec.Attr and faSysFile) = faSysFile) then Continue;

if (SearchRec.Attr and faDirectory) <> faDirectory then begin

// file

ext:=LowerCase(ExtractFileExt(SearchRec.Name));

if (pos('mp3',ext)>0) OR (pos('wav',ext)>0) OR (pos('wma',ext)>0) OR (pos('wmv',ext)>0) OR (pos('avi',ext)>0) OR (pos('mkv',ext)>0) then begin

// file ok

result.Add(SearchRec.Name)

end;

end;

until FindNext(SearchRec) <> 0;

end;

FindClose(SearchRec);

end;

 

procedure TWMVPlayer.Load(filename:string);

begin

Edit1.Text:='';

Played:=false;

if FileExists(FileName) then begin

MediaPlayer.FileName:=FileName;

MediaPlayer.Open;

Edit1.Text:=ExtractFileName(FileName);

if (LowerCase(ExtractFileExt(MediaPlayer.FileName)) = '.mp3') OR

(LowerCase(ExtractFileExt(MediaPlayer.FileName)) = '.wav') OR

(LowerCase(ExtractFileExt(MediaPlayer.FileName)) = '.wma')

then

DisplayPanel.Caption:=audio

else begin

DisplayPanel.Caption:='';

MediaPlayer.Display:=DisplayPanel;

end;

Loaded:=true;

TrackBar1.Position:=Round(Volume/100);

end else begin

ShowMessage('Media WMV Player - íåò ôàéëà äëÿ îòêðûòèÿ');

Loaded:=false;

Abort;

end;

end;

 

procedure TWMVPlayer.OpenButtonClick(Sender: TObject);

begin

if OpenDialog.Execute then begin

Play(OpenDialog.FileName);

end;

end;

 

procedure TWMVPlayer.Pause;

begin

Timer.Enabled:=false;

if (loaded) then begin

MediaPlayer.Pause;

Played:=not Played;

Timer.Enabled:=Played;

end;

end;

 

procedure TWMVPlayer.PauseButtonClick(Sender: TObject);

begin

//pause

Pause;

end;

 

procedure TWMVPlayer.Play(filename: string);

begin

if filename = '' then if loaded then begin

MediaPlayer.Play;

Played:=true;

Timer.Enabled:=true;

exit;

end;

if (loaded) AND (filename=MediaPlayer.FileName) then begin

MediaPlayer.Play;

Played:=true;

Timer.Enabled:=true;

exit;

end;

//MediaPlayer.FileName:=filename;

Load(filename);

MediaPlayer.Play;

Played:=true;

ProgressBar1.Max:=MediaPlayer.Length;

ProgressBar1.Position:=0;

Timer.Enabled:=true;

MediaPlayer.DisplayRect:=DisplayPanel.Canvas.ClipRect;

end;

 

procedure TWMVPlayer.PlayButtonClick(Sender: TObject);

begin

// play

Play;

end;

 

procedure TWMVPlayer.ProgressBar1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if not Loaded then exit;

if Button = mbLeft then begin

ProgressBar1.Position:=round(

(ProgressBar1.max/(ProgressBar1.Width-2))*X

);

MediaPlayer.Position:=ProgressBar1.Position;

if Played then MediaPlayer.Play;

end;

end;

 

 

function TWMVPlayer.Rvol: integer;

begin

result:=1000;

if Loaded then begin

result:=GetMPVolume(MediaPlayer);

end;

end;

 

function TWMVPlayer.SecondsToTime(sec: double): String;

var

M, S, H: INTEGER;

begin

S := Round(Sec);

M:= Round(INT(S / 60));

S := S - M * 60; //Seconds

H := Round(INT(M / 60)); //Hours

M := M - H * 60; //Minutes

if H=0 then result:='' else result:=inttostr(H)+b_time_rz;

if M<10 then result:=result+'0';

result:=result+inttostr(M)+b_time_rz;

if S<10 then result:=result+'0';

result:=result+inttostr(S);

end;

 

 

procedure TWMVPlayer.Stop;

begin

if loaded then begin

loaded:=false;

Played:=false;

MediaPlayer.Close;

Edit1.Text:='';

DisplayPanel.Caption:='';

end;

end;

 

procedure TWMVPlayer.StopButtonClick(Sender: TObject);

begin

Stop;

end;

 

procedure TWMVPlayer.TimerResizeTimer(Sender: TObject);

begin

MediaPlayer.DisplayRect:=Rect(0,0,DisplayPanel.Width-1,DisplayPanel.Height-1);

TimerResize.Enabled:=false;

end;

 

procedure TWMVPlayer.TimerTimer(Sender: TObject);

begin

if Loaded and Played then begin

ProgressBar1.Position:=MediaPlayer.Position;

Label1.Caption:=SecondsToTime(MediaPlayer.Position/1000) + ' / '+

SecondsToTime(ProgressBar1.max/1000);

if ProgressBar1.Position=ProgressBar1.Max then Played:=false;

end else begin

Timer.Enabled:=false;

ProgressBar1.Position:=0;

Label1.Caption:=SecondsToTime(0);

end;

end;

 

procedure TWMVPlayer.TrackBar1Change(Sender: TObject);

begin

Self.Volume:=TTrackBar(Sender).Position*100;

end;

 

procedure TWMVPlayer.Wvol(const Value: integer);

begin

if Loaded then SetMPVolume(MediaPlayer,value);

end;

 

end.