Советы по Delphi

         

Мультимедиа-программирование в Delphi


Вы можете легко придать программе Delphi мультимедийные черты, добавив в нее зкуки, видео и музыку. Данный материал расскажет вам о том, как это можно достичь с помощью элементов управления мультимедиа, доступных их среды разработки Delphi. Полный исходный код для всех программ доступен на сервере compuserve.

При чтении данного материала вы узнаете о трех типах файлов, использующихся в мультимедиа-программах:

  1. Файлы с расширением AVI, включающие видео. Примерами такого типа файлов могут служить ELEPHANT.AVI и FLOWERS.AVI.
  2. Файлы с расширением MID, включающие в себя музыкальные фрагменты в формате Musical Instrument Digital Interface, или MIDI. Примерами такого типа файлов могут служить JAZZ.MID и VIVALDI.MID.
  3. Файлы с расширением WAV включают в себя звуки, созданные с помощью технологии Microsoft WAVE. Примерами такого типа файлов могут служить CRASH.WAV или SPEECH.WAV.
Из трех обсуждаемых здесь форматов файлов, по размеру файлы AVI обычно самые большие. Даже сравнительно короткие AVI-фильмы со временем воспроизведения одна минута или менее, стремяться занять до 5, или даже до 10Мб дискового пространства. Для уменьшения размера таких файлов обычно применяются различные методы сжатия. WAV-файлы также велики, но уже не такие большие, как файлы AVI. MID-файлы небольшие по размеру, компактные и обеспечивают отличное качество звучания. Тем не менее, в них не так легко поместить звуки или голос, и они очень ограничены в музыкальном плане.

Delphi и Мультимедиа

Delphi содержит в своей палитре компонент TMediaPlayer, который позволяет получить доступ в вашей программе ко всем основным возможностям мультимедиа. Данный элемент управления очень легок в использовании. Фактически, он настолько прост, что для многих начинающих программистов будет проще создать из двух-трех строк программу, воспроизводящую видео или проигрывающую музыку, чем написать приложение, выводящее фразу "Здравствуй, мир". Для того, чтобы знать как управлять таким мощным элементом управления под названием TMediaPlayer, необходимо помнить, что под его капотом для вас работает технология Microsoft под названием Media Control Interface (MCI). Эта технология дает программистам доступ ко всему разнообразию мультимедиа. TMediaPlayer делает использование этих технологий чрезвычайно легким и интуитивно понятным.

Компонент TMediaPlayer

Для того, чтобы начать создавать наше первое мультимедиа-приложение, создайте новый проект и выберите мультимедийный компонент управления (TMediaPlayer) на закладке "Additional" Палитры Компонентов. Разместите компонент на середине формы.

После размещения компонента на форме, в Инспекторе Объектов будет доступно свойство "FileName". Заполните его именем AVI, MIDI или WAVE файла. Для примера, я заполнил это свойство строкой G:\AVI\CLOUDS.AVI, указывающий на имя видео-файла, размещенного на моем CD-ROM. Щелкнув на иконке в правой части Редактора Свойств, можно вызвать диалог поиска нужного вам файла.

После завершения простых шагов, приведенных выше, вы уже готовы для запуска вашей мультимедиа-программы. Запустите и нажмите на зеленую кнопку в левой части MediaPlayer для старта видео- или звукового файла, который вы перед этим выбрали. Если вы получаете ошибку, то для нее существует три вероятных причины:

  • Вы указали неверное имя файла.
  • В вашей системе неправильно установлены компоненты мультимедиа. Это может означать, что вы не имеете надлежащего аппаратного обеспечения, или у вас в системе не установлены правильные драйвера. Конфигурирование драйверов осуществляется через Панель Управления, а аппаратные требования хорошо описаны в любой книге, посвященной мультимедиа.
  • Вы установили свойство AutoOpen в true, но оставили пустым свойство FileName. Это вызовет следующее сообщение об ошибке: "This command requires a parameter. Please supply one" error message. (Данная команда требует параметр. Пожалуйста, предоставьте один)
Пример программы доступен в каталоге demo и называется MEDIA1.DPR. По умолчанию она проигрывает файл CHIMES.WAV, который поставляется с каждой версией Windows. Если вы удалили этот файл, или его не оказалось в каталоге C:\WINDOWS, вым необходимо изменить в этой программе свойство FileName.

После небольших экспериментов, проведенных с программой MEDIA1, вы обнаружите, что программа может проигрывать файлы AVI, MIDI и WAVE, после простого изменения имени файла. Эта гибкость является результатом способности компонента анализировать свойство FileName, определять расширение файла и передавать его на обработку соответствующему внутреннему компоненту.

MediaPlayer во время выполнения приложения: если вы разместили компонент TMediaPlayer в окне, выбрали файл, и запустили программу, вы можете обнаружить, что медиа-проигрыватель стартует в в "действующем" режиме; это означает, что большинство оперирующих кнопок доступны и готовы к работе. Если вы закроете программу, установите свойство AutoOpen в False, и перезапустите программу, медиа-проигрыватель не будет открытым при следующем запуске программы. При некоторых обстоятельствах это может оказаться полезным, поскольку может сэкономить время и ресурсы при открытии мультимедиа-драйверов Windows.

Для получения контроля над открытием и закрытием TMediaPlayer необходимо несколько простых шагов. Для начала разместите на форме кнопку и дайте ей имя Open. Дважды щелкните на кнопке для создания обработчика события OnClick, и разместите в нем следующий код:



    procedure TForm1.Button1Click(Sender: TObject): begin MediaPlayer.Open; end;

При запуске программы вы увидите кнопки с универсальными символами для проигрывателя, CD или видеомагнитофона. Щелкните на кнопке для открытия соответствующиего MCI-устройства. Подождите немного, пока не изменится цвет кнопок MediaPlayer, после чего щелкните один раз на зеленой стрелке в левой части элемента управления. После этого начнется воспроизведение файла, который вы определили для себя в секции "FileName".

Программы доступа к мультимедиа

Некоторые программисты пытаются предоставить пользователям удобный и легкий способ воспроизведения файлов широкого диапазона. Для этого в программу встраивается возможность получения доступа к жесткому диску и CD-ROM, выбор файлов различных форматов и их воспроизведение. Такой тип приложений иногда называют Программами медиа-доступа.

Чтобы начать создавать приложение MediaAccess, расположите на форме TMediaPlayer и кнопку. Дайте имя кнопке BSelectFile, а заголовок "Select File" (выбор файла). Затем выберите OpenDialog из закладки Dialogs Палитры Компонентов, и разместите этот компонент на форме. После того, как вы это сделаете, ваша форма будет похожа на ту, которая приведена на рисунке 0-4. Теперь самое время сохранить программу под именем ACCESS.

Рисунок 0-4: Главная форма приложения ACCESS.

Теперь создадим метод BSelectFileClick, который должен выглядеть примерно так:

    procedure TForm1.BSelectFileClick(Sender: TObject); begin MediaPlayer1.Close; if OpenDialog1.Execute then begin MediaPlayer1.FileName := OpenDialog1.FileName; MediaPlasyer1.Open; end; end

Приведенный выше код будет выполняться каждый раз при нажатии пользователем кнопки выбора файла ("Select File"). Принцип работы кода может быть показан в четырех шагах:

На первом шаге необходимо закрыть все MCI-устройства, которые могли бы быть к настоящему времени открытыми. Это мы делаем с помощью вызова метода MediaPlayer1.Close. При открытии программы эта строка не делает ничего полезного, но, после того как вы открыли один файл, и хотите открыть второй, вам понадобится "очистить" устройство. Вызов метода Close компонента TMediaPlayer в любом его состоянии никогда не приведет к ошибке. На втором шаге выполняется OpenDialog. Вызов диалога выбора файла позволяет пользователям производить поиск файла как на жестком диске, так и на доступных CD-ROM'ах. После того, как они нашли файл, который они хотят воспроизвести, то для его выбора достаточно щелкнуть на кнопке OK. Третий шаг выполняется только если пользователь выбрал файл. В случае, если в диалоге OpenDialog они выберут Cancel, то ничего не произойдет. Быстрый взгляд на код дает понять, что выбранный пользователем файл очень просто назначить компоненту MCI. Как только будет определено подходящее имя файла, то для его открытия (или переоткрытия) MCI устройством достаточно сделать последний шаг - осуществить вызов MediaPlayer1.Open. После этого пользователь уже может нажимать на зеленую стрелку для воспроизведения файла.

Теперь осталось добавить несколько небольших штрихов, чтобы программа стала более дружественной по отношению к пользователю. Например, вы можете предложить пользователю выбрать файл с определенным расширением, например, AVI, WAV или MID. Есть два способа сделать это.

Первый путь является методом, который вы используете если хотите показать сразу все три типа файлов. Для использования этого метода заполните в Инспекторе Объектов секцию Filter следующей строкой: Мультимедиа файлы(*.avi;*wav;*.mid)|*.avi;*.wav;&.mid Теперь пользователь может одновременно выбрать WAVE, MIDI и видео-файл.

В качестве альтернативы, вы можете присвоить свойству OpenDialog Filter такую строку: AVI файлы(*.avi)|*.avi|WAVE файлы(*.wav)|*.wav| MIDI файлы(*.MID)|*.mid Чтобы легче было понять читающему ваши строки человеку, строку можно разбить на три секции: AVI файлы(*.avi)|*.avi WAVE файлы(*.wav)|*.wav MIDI файлы(*.MID)|*.mid Каждая из этих секций содержит по одному символу-бару ( | ), позволяющему разделить одну секцию от другой. Если при работающей программе активизируется OpenDialog, то первая половина строки (вплоть до бара) будет показана в секции List File Type (Список типов файлов) OpenDialog, а вторая половина в секции FileName (имя файла). В этом случае для выбора нужного типа файлов достаточно нажать правую кнопку выпадающего списка и выбрать подходящее расширение.

Другое свойство OpenDialog, с помощью которого вы могли бы сделать жизнь пользователя комфортнее, это InitialDir. Вы можете использовать это свойство для определения устройства или каталога, который будет показан при открытии диалога. Это позволит направить пользователя в каталог, где вероятность расположения мультимедиа-файлов наиболее высока, а не заставлять искать их по всему компьютеру. Поскольку я не определяю конкретный каталог, пользователи могут сами выбрать нужный каталог, и возвращаться к нему снова и снова, выбирая в нем очередной мультимедийный файл для прослушивания.

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

Возможности TMediaPlayer во время выполнения программы были показаны на примере очень простой программы медиа-доступа с именем ACCESS, каковую никому не составит труда скомпоновать. Программа за счет мультимедиа-компонента очень функциональна, так что она может удовлетворить потребности в мультимедиа-возможностях большинство программистов. Тем не менее, существуют случаи, когда требуется глубже знать механизм работы компонента и проигрывания файлов. В следующем разделе данной статьи описывается программа с именем ACCESS2 и дается информация, которая позволит вам получить полный контроль над всеми возможностями MCI-мультимедии.

Перед началом повествования позвольте сделать два маленьких замечания:

Хотя большинство программистов сочтут эту информацию полезной, все же она адресуется в первую очередь мультимедиа-программистам. Некоторые программисты рвутся пойти еще дальше, чем просто управлять компонентом и воспроизводить мультимедийные файлы, как показано в этом разделе. Такие интузиасты должны понимать, что они должны перейти на более низкий уровень программирования, полностью игнорируя TMediaPlayer и работая с набором низкоуровневых команд Windows, которые можно найти в поставляемом с Delphi модуле MMSYSTEM.PAS. Рассказать о том, как работать с такими низкоуровневыми командами не входило в планы авторов этой статьи.

C этими двумя замечаниями и со свежей головой вы теперь готовы узнать о более тонких аспектах работы с TMediaPlayer.

Вы, вероятно, обратили внимание, что палитра событий для MediaPlayer содержит группу специальных событий, обработкой которых вы можете заняться в вашей программе. Эти методы подразделяются на две категории:

  • Первая категория состоит из событий типа OnClick, которые происходят, когда пользователь нажимает какую-то область на элементе управления. Например, событие OnPlay с параметром Button посылается вашей программе при каждом нажатии на зеленую стрелку (проигрывание) компонента MediaPlayer.
  • Вторая категория состоит из событий типа OnNotify, содержащих сообщения mm_MciNotify. Такие сообщения посылаются вашему окну при начале или окончании проигрывания файла, или при возникновении ошибки.
Обе категории ошибок обсуждаются в следующих параграфах.

Имеется восемь специализированных событий, возникающих при прямом щелчке на элементе управления, которые все перехватываются и передаются в TMPBtnType: btPlay: Возникает при нажатии пользователем зеленой стрелки проигрывания. btStop: Возникает при нажатии пользователем красного квадратика на кнопке остановки. btBack: Возникает при нажатии пользователем на голубую кнопку "На один фрагмент назад". btStep: Возникает при нажатии пользователем на голубую кнопку "На один фрагмент вперед". btNext: Возникает при нажатии пользователем на голубую кнопку "быстрая перемотка". btPrev: Возникает при нажатии пользователем на голубую кнопку "перемотка". btPause: Возникает при нажатии пользователем на желтую кнопку паузы. btRecord: Возникает при нажатии пользователем на красный кружок кнопки остановки. Если вы хотите увидеть, как возникают эти события, то начните с размещения на своей форме четырех полей редактирования (компоненты Edit). Каждый из этих элементов управления будет использован событием, но они не будут играть первую роль в программе, которую я собираюсь вам описать. Создайте для TMediaPlayer обработчик события OnClick, и расположите в нем код, который должен выглядеть похожим на следующий:

    procedure TForm1.MediaPlayer1Click(Sender: TObject; Button: TMpBtnType; var DdDefault: Boolean); begin Edit1.Text := 'Воспроизведение'; end;

После того, как вы поймете, как работает эта система, вам останется только в момент возникновения события от MediaPlayer заполнять поле нужным тестовым сообщением. Для примера приведем метод, который будет вызываться всякий раз, когда пользователь будет нажимать кнопку медиа-проигрывателя:

    procedure TForm1.MediaPlayer1Click(Sender: TObject; Button: TMPBtnType; var DoDefault: Boolean); begin case Button of btPlay: Edit1.Text := 'Воспроизведение'; btPause: Edit1.Text := 'Пауза'; btStop: Edit1.Text := 'Стоп'; btNext; Edit1.Text := 'Следующая'; btPrev: Edit1.Text := 'Предыдущая'; btStep: Edit1.Text := 'Перемотка'; btBack: Edit1.Text := 'Назад'; btREcord: Edit1.Text := 'Запись'; btEject: Edit1.Text := 'Извлечь'; end; end;

Чтобы обнаружить окончание воспроизведения, или наличие ошибки, необходимо взглянуть на сообщение OnNotify. При работе непосредственно с операционной системой, эти сообщения могут принимать четыре значения: mci_Notify_Successful: Посылается при завершении работы команды mci_Notify_Superseded: Прерывание команды другой функцией mci_Notfiy_Aborted : Текущая функция прервана mci_Notify_Failure : Произошла ошибка Delphi не посылает эти сообщения непосредственно вам, вместо этого она преобразует их в константы, например, nvSuccessful, nvAborted и прочие. Такой механизм был принят для обеспечения согласованности и взаимодействия различных частей библиотеки Delphi VCL.

Немного запутан вопрос какое сообщение в какой момент посылается. Как правило, вы получаете:

  • Сообщения nvSuccessful, когда команда успешно завершена.
  • Сообщение nvSuperseded, если система находилась в режиме временной остановки (паузы), а пользователь нажал кнопку воспроизведения.
  • Сообщение nvAborted, если пользователь нажимает на кнопку остановки, или закрывает устройство.
Ниже приведена функция, реагирующая на сообщения OnNotify, и отображающая короткую строку описания в поле редактирования:

    procedure TForm1.MediaPlayer1Notify(Sender: TObject); var S: String; begin case MediaPlayer1.NotifyValue of nvSuccessful: begin Inc(Total); S := 'mci_Notify_Successful' + IntToStr(Total); end; nvSuperseded: S := 'mci_Notify_Superseded'; nvAborted: S := 'mci_Notify_Aborted'; nvFailure: S := 'mci_Notify_Failure'; else S := 'Неизвестное нотификационное сообщение'; end;
Edit2.Text := S;
if (MediaPlayer1.NotifyValue = nvSuccessful) and (MediaPlayer1.Mode = mpStopped) then Edit1.Text := 'Окончание проигрывания файла'; end;

Данная функция будет автоматически вызываться каждый раз при возникновении значимого события, которое влияет на текущее состояние устройства MCI. Никогда не вызывайте явно эту функцию сами. Вместо этого ждите, пока ее не вызовет сама система.

Сердцем метода MediaPlayer1Notify является проверка текущего состояния поля NotifyValue у TMediaPlayer. К примеру, если поле NotifyValue содержит mci_Notify_Successful, то в поле редактирования будет помещена определенная строка. И снова повторюсь: вы не должны предпринимать никаких шагов для изменения состояния поля NotifyValue. Оно изменяется системой автоматически. В ваши обязанности входит только ожидание события OnNotify, и проверка поля NotifyValue.

Чтобы быть уверенным, что проигрывание файла завершено, дождитесь прихода сообщения mci_Notify_Successful, после чего убедитесь, что текущий режим - mci_Mode_Stop.

Текущий режим MCI-устройства определяется свойством Mode у TMediaPlayer. Вот список "общих" значений, которые могут определяться в этом поле: mci_Mode_Not_Ready mci_Mode_Stop mci_Mode_Play mci_Mode_Record mci_Mode_Seek mci_Mode_Pause mci_Mode_Open Имя каждого из этих значений указывает на соответствующий режим. Так, если поле Mode содержит mci_Mode_Stop, устройство остановлено. Если свойство содержит mci_Mode_Play, утройство в настоящий момент находится в режиме воспроизведения. И снова повторюсь: Delphi не посылает вам эти константы напрямую, а вместо этого пользуется своими константами, такими, как mpStopped, mpPlaying, и прочими.

Если ваше приложение получило сообщение mci_Notify_Successful, а поле Mode было установлено в mci_Mode_Stop, вы можете быть уверены, что воспроизведение текущего файла завершено. Ниже приведен метод OnNotify, проверяющий эти условия:

    if (MediaPlayer1.NotifyValue = nvSuccessful) and (MediaPlayer1.Mode = mpStopped) then Edit1.Text := 'Воспроизведение файла окончено';

Программа ACCESS2 содержит также приведенный ниже метод, проверяющий текущее состояние медиа-проигрывателя:

    procedure TForm1.SetMode; begin case MediaPlayer1.Mode of mpNotReady: Edit3.Text := 'mci_Mode_Not_Ready'; mpStopped: Edit3.Text := 'mci_Mode_Stop'; mpPlaying: Edit3.Text := 'mci_Mode_Play'; mpRecording: Edit3.Text := 'mci_Mode_Record'; mpSeeking: Edit3.Text := 'mci_Mode_Seek'; mpPaused: Edit3.Text := 'mci_Mode_Pause'; mpOpen: Edit3.Text := 'mci_Mode_Open'; else begin Edit1.Text := 'Устройство неактивно' Edit2.Text := 'Нет специальных сообщений'; Edit3.Text := 'Неизвестно'; Edit4.Text := 'Файл не выбран'; end; end; end;

Эта программа вызывается в ответ на срабатывание таймера (TTimer), расположенного на форме. Чтобы создать таймер, просто выберите его на закладке System Палитры Компонентов, расположите на форме, и создайте обработчик события OnTimer. Метод не должен ничего делать, кроме как вызывать процедуру SetMode, рассмотренную выше. Свойство Interval компонента TTimer определяет частоту генерирования событий OnTimer. Если вы оставляете значение Interval 1000 миллисекунд, заданное по-умолчанию, то SetMode будет вызываться каждую секунду, тем самым гарантируя, что пользователь будет в курсе текущего состояния TMediaPlayer.

При работе с программой ACCESS2, обратите внимание на следующие ключевые моменты в коде (что вы можете почерпнуть полезного из кода):

  • При каждом нажатии пользователем на MediaPlayer автоматически генерируется событие. Например, если пользователь нажимает на зеленую стрелку воспроизведения, вашей программе посылается событие btPlay. Для того, чтобы реагировать на это событие, создайте метод OnClick, просто дважды щелкнув на соответствующей строке Инспектора Объектов.
  • Сообщения mm_MciNotify посылаются вашей программе в момент возникновения в цикле "жизни" мультимедиа-файла ключевых событий. Например, при завершении проигрывания файла, вашему приложению посылается сообщение mci_Notify_Successful. Вы даже можете реагировать на это в обработчике события OnNotify.
  • Вы можете сделать запрос системе на предмет текущего состояния выбранного мультимедиа-устройства. Чтобы сделать это, следует "ознакомиться" со значением свойства Mode у MediaPlayer. К примеру, если MediaPlayer1.Mode = mpPlaying, то вы можете быть уверены, что устройство в данный момент находится в режиме воспроизведения.
Элемент управления TMediaPlayer полностью освобождает вас от необходимости работы с интерфейсом Microsoft MCI, описанным в модуле MMSYSTEM.PAS. Тем не менее, если вы хотите стать экспертом в затрагиваемой области, вы должны посмотреть как на этот модуль, так и на то, как он вызывается из MPLAYER.PAS.

Заключение

Изучив данный материал, вы узнали как работает элемент управления TMediaPlayer, и как можно заставить его проигрывать WAVE, MIDI и AVI файлы. Delphi предоставляет простой и одновременно эффективный способ создания собственных мультимедийных приложений. Используйте данный материал как отправную точку, а ваше воображение как руководство к действию.

Не забывайте о том, что Windows предоставляет вам полный набор возможностей Multimedia. Многие из них доступны через компонент TMediaPlayer. Тем не менее, если вы хотите узнать об этой стороне операционной системы немного больше, Delphi не только вас не ограничит, а еще и предоставит в ваше распоряжение отличный инструмент для работы с низкоуровневыми командами. [001986]



Содержание раздела