Универсальный проигрыватель 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.
Еще одно свойство MediaPlayer — AutoOpen. Если оно установлено в 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.