type
EMyMCIException = class(Exception);
var
FDeviceID: Word;
MyError, dwFlags: Longint;
procedure TForm1.GetWaveLength;
var
WaveLen: DWORD;
begin
OpenMedia('C:\Hickory.wav');
SetMediaTimeFormat;
WaveLen := GetMediaStatus(MCI_STATUS_LENGTH);
CloseMedia;
Form1.label1.Caption := IntToStr(WaveLen) + 'mS';
end;
procedure TForm1.OpenMedia(FileName: string);
var
MyOpenParms: TMCI_Open_Parms;
beginwith MyOpenParms dobegin
dwCallback := Handle; // TForm1.Handle
lpstrDeviceType := PChar('WaveAudio');
lpstrElementName := PChar(FileName);
end; {with MyOpenParms}
dwFlags := MCI_WAIT or MCI_OPEN_ELEMENT or MCI_OPEN_TYPE;
MyError := mciSendCommand(0, MCI_OPEN, dwFlags, Longint(@MyOpenParms));
// one could use mciSendCommand(DevId, etc here to specify a particular
device
if MyError = 0 then
FDeviceID := MyOpenParms.wDeviceID
elseraise EMyMCIException.Create('Open Failed');
end;
procedure TForm1.SetMediaTimeFormat;
var
MySetParms: TMCI_Set_Parms;
beginif FDeviceID <> 0 thenbegin
dwFlags := MCI_WAIT or MCI_SET_TIME_FORMAT;
MySetParms.dwCallback := Handle; // TForm1.Handle
MySetParms.dwTimeFormat := MCI_FORMAT_MILLISECONDS;
MyError := mciSendCommand(FDeviceID, MCI_SET, dwFlags,
Longint(@MySetParms));
if MyError <> 0 thenraise EMyMCIException.Create('Status Failed');
end;
end;
function TForm1.GetMediaStatus(StatusItem: DWORD): DWORD;
var
MyStatusParms: TMCI_Status_Parms;
beginif FDeviceID <> 0 thenbegin
dwFlags := MCI_WAIT or MCI_STATUS_ITEM;
MyStatusParms.dwCallback := Handle; // TForm1.Handle
MyStatusParms.dwItem := StatusItem;
MyError := mciSendCommand(FDeviceID, MCI_STATUS, dwFlags,
Longint(@MyStatusParms));
if MyError = 0 then
Result := MyStatusParms.dwReturn
elsebeginraise EMyMCIException.Create('Status Failed');
end;
end;
end;
procedure TForm1.CloseMedia;
var
MyGenParms: TMCI_Generic_Parms;
beginif FDeviceID <> 0 thenbegin
dwFlags := 0;
MyGenParms.dwCallback := Handle; // TForm1.Handle
MyError := mciSendCommand(FDeviceID, MCI_CLOSE, dwFlags,
Longint(@MyGenParms));
if MyError = 0 then
FDeviceID := 0
elsebeginraise EMyMCIException.Create('Close Failed');
end;
end;
end;
Перевод контента на русский язык:
Приведенный код Delphi предназначен для открытия файла WAV, получения его длины в миллисекундах и отображения ее в лейбле.
Разбор кода:
Тип EMyMCIException определен как класс исключений.
Переменные FDeviceID, MyError и dwFlags объявлены как глобальные переменные для хранения идентификатора устройства, статуса ошибки и флагов для команд MCI соответственно.
Процедура GetWaveLength открывает файл WAV с помощью процедуры OpenMedia, устанавливает формат времени в миллисекундах с помощью процедуры SetMediaTimeFormat, получает длину файла с помощью функции GetMediaStatus с параметром MCI_STATUS_LENGTH и закрывает файл с помощью процедуры CloseMedia.
Значение label1.Caption обновляется до длины файла в миллисекундах.
Процедура OpenMedia открывает устройство или элемент медиа с помощью команд MCI. Она принимает имя файла как параметр и настраивает необходимые параметры для открытия устройства.
Процедура SetMediaTimeFormat устанавливает формат времени для открытого устройства в миллисекундах.
Функция GetMediaStatus получает статус открытого устройства, включая его длину в указанном формате времени (миллисекундах).
Приведенный код является хорошим примером использования команд MCI в Delphi для взаимодействия с аудиофайлами. Однако он может быть улучшен и упрощен. Например, обработка ошибок могла бы быть более robust, а процедуры могли быть объединены в одиночную функцию, которая принимает имя файла как параметр и возвращает длину файла.
Вот пример упрощения кода:
functionGetWaveLength(FileName:string):integer;varWaveLen:DWORD;beginResult:=-1;// Инициализируем результат, указывая на неудачуtryOpenMedia(FileName);SetMediaTimeFormat;WaveLen:=GetMediaStatus(MCI_STATUS_LENGTH);CloseMedia;Result:=WaveLen;exceptonE:EMyMCIExceptiondoShowMessage(E.Message);end;ifResult=-1thenMessageDlg('Не удалось получить длину файла',mtError,[mbOk],0)end;
В этом упрощенном варианте функция GetWaveLength принимает имя файла как параметр и возвращает длину файла. Она использует блок try-except для обработки исключений, которые могут возникнуть при выполнении кода. Если исключение возникает, оно отображается сообщением об ошибке. Наконец, если результат все еще равен -1 (индикатор неудачи), отображается диалоговое окно с сообщением о том, что длину файла невозможно получить.
В статье описывается программный код на языке Pascal, который позволяет определить длину WAV-файла с помощью библиотеки MCI (Microsoft Media Control Interface) и отображать ее в виде строки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.