{....}privateprocedure OpenMedia(WaveFile : string);
function GetStatus(StatusRequested : DWord) : longint;
procedure CloseMedia;
{....}var
MyError, dwFlags: Longint;
FDeviceID : Word;
{....}uses
MMSystem;
{....}procedure TForm1.OpenMedia(WaveFile: string);
var
MyOpenParms: TMCI_Open_Parms;
beginwith MyOpenParms dobegin
dwCallback := Handle; // TForm1.Handle
lpstrDeviceType := PChar('WaveAudio');
lpstrElementName := PChar(WaveFile);
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, here to specify a particular device if MyError = 0 then
FDeviceID := MyOpenParms.wDeviceID
elseraise Exception.Create('Open Failed');
end;
function TForm1.GetStatus(StatusRequested: DWORD): Longint;
var
MyStatusParms: TMCI_Status_Parms;
begin
dwFlags := MCI_WAIT or MCI_STATUS_ITEM;
with MyStatusParms dobegin
dwCallback := Handle;
dwItem := StatusRequested;
end;
MyError := mciSendCommand(FDeviceID,
MCI_STATUS,
MCI_WAIT or MCI_STATUS_ITEM,
Longint(@MyStatusParms));
if MyError = 0 then
Result := MyStatusParms.dwReturn
elseraise Exception.Create('Status call to get status of ' +
IntToStr(StatusRequested) + ' Failed');
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 Exception.Create('Close Failed');
end;
end;
end;
//Example: procedure TForm1.Button1Click(Sender: TObject);
beginif OpenDialog1.Execute thenbegin
OpenMedia(OpenDialog1.FileName);
with ListBox1.Items dobegin
Add('Average Bytes / Sec : ' + IntToStr(GetStatus(MCI_WAVE_STATUS_AVGBYTESPERSEC)));
Add('Bits / Sample : ' + IntToStr(GetStatus(MCI_WAVE_STATUS_BITSPERSAMPLE)));
Add('Samples / Sec : ' + IntToStr(GetStatus(MCI_WAVE_STATUS_SAMPLESPERSEC)));
Add('Channels : ' + IntToStr(GetStatus(MCI_WAVE_STATUS_CHANNELS)));
end;
CloseMedia;
end;
end;
Переведенный текст:
Код - это приложение Delphi, использующее единицу MMSystem для открытия и манипуляции файлом WAV. Программа может открывать файл WAV, получать его свойства (битрейт, частота дискретизации и т.д.) и закрывать.
Чтобы определить битрейт файла WAV с помощью этого кода, вы бы использовали функцию GetStatus с константой MCI_WAVE_STATUS_BITSPERSAMPLE в качестве аргумента. Результат будет битрейтом в битах на пробел, который можно затем преобразовать в байты в секунду, умножив его на частоту дискретизации.
Вот модифицированная версия кода, которая рассчитывает и отображает битрейт:
Модифицированный код добавляет новую строку в список, отображающую рассчитанный битрейт в байтах в секунду. Битрейт рассчитывается умножением битрейта на пробел на частоту дискретизации и затем делением на 8 (поскольку в байте есть 8 бит).
В статье описывается реализация программы на языке Delphi, которая позволяет определять битрейт WAV-файла с помощью библиотеки MMSystem.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.