Создание пустого wav-файла

Как мне создать пустой wav-файл? Это просто пустой двоичный файл?
The TMediaPlayer может открыть звуковой файл, если он содержит, по крайней мере, один байт данных. Я обнаружил это, когда с помощью данного компонента пытался создать и открыть звуковой файл, содержащий только заголовок звукового файла. The TMediaplayer не захотел этого делать.
Нижеприведенный код создаст звуковой файл размером 1 байт. Конечно это криво, но это работает. Вам необходимо лишь добавить MMSYSTEM ко всем модулям, использующим данную функцию.

function CreateNewWave(NewFileName: string): Boolean;

var

 DeviceID: Word;

 Return: LongInt;

 MciOpen: TMCI_Open_Parms;

 MciRecord: TMCI_Record_Parms;

 MciPlay: TMCI_Play_Parms;

 MciSave: TMCI_SaveParms;

 MCIResult: LongInt;

 Flags: Word;

 TempFileName: array[0..255] of char;

begin

 MediaPlayer.Close;

 StrPCopy(TempFileName, NewFileName);

 MciOpen.lpstrDeviceType := 'waveaudio';

 MciOpen.lpstrElementName := '';

 Flags := Mci_Open_Element or Mci_Open_Type;

 MCIResult := MciSendCommand(0, MCI_OPEN, Flags, LongInt(@MciOpen));

 DeviceID := MciOpen.wDeviceId;

 MciRecord.dwTo := 1;

 Flags := Mci_To or Mci_Wait;

 MCIResult := MciSendCommand(DeviceID, Mci_Record, Flags, LongInt(@MciRecord));

 mciPlay.dwFrom := 0;

 Flags := Mci_From or Mci_Wait;

 MciSendCommand(DeviceId, Mci_Play, Flags, LongInt(@MciPlay));

 mciSave.lpfileName := TempFilename;

 Flags := MCI_Save_File or Mci_Wait;

 MCIResult := MciSendCommand(DeviceID, MCI_Save, Flags, LongInt(@MciSave));

 Result := MciSendCommand(DeviceID, Mci_Close, 0, LongInt(nil)) = 0;

end;

Как мне очистить содержимое Wav-файла? Просто заново создать пустой?
Вот небольшой компонент, позволяющий стирать любую часть wave-файла:

unit Nickmp;

interface

uses

 SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,

 Forms, Dialogs, MPlayer, MMSystem;

type

 TNickMediaPlayer = class(TMediaPlayer)

 private

{ Private declarations }

 protected

{ Protected declarations }

 public

{ Public declarations }

  function DeleteWaveChunk(aFrom, aTo: LongInt): Longint;

 published

{ Published declarations }

 end;

procedure Register;

implementation

procedure Register;

begin

 RegisterComponents('Samples', [TNickMediaPlayer]);

end;

function TNickMediaPlayer.DeleteWaveChunk(aFrom, aTo: LongInt): Longint;

var

 DeleteParms: TMCI_WAVE_DELETE_PARMS;

 Flags: LongInt;

begin

 Flags := 0;

 if Wait then Flags := mci_Wait;

 if Notify then Flags := Flags or mci_Notify;

 DeleteParms.dwCallback := Handle;

 Flags := Flags or mci_From;

 DeleteParms.dwFrom := aFrom;

 Flags := Flags or mci_To;

 DeleteParms.dwTo := aTo;

 Result := mciSendCommand(DeviceID, mci_Delete, Flags, Longint(@DeleteParms));

end;

end.

- Nick Hodges
Взято из Советов по Delphi от Валентина Озерова
Сборник Kuliba

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...