The TMediaPlayer может открыть звуковой файл, если он содержит, по крайней мере, один байт данных. Я обнаружил это, когда с помощью данного компонента пытался создать и открыть звуковой файл, содержащий только заголовок звукового файла. The TMediaplayer не захотел этого делать.
Нижеприведенный код создаст звуковой файл размером 1 байт. Конечно это криво, но это работает. Вам необходимо лишь добавить MMSYSTEM ко всем модулям, использующим данную функцию.
function CreateNewWave(NewFileName: String): Boolean; varDeviceID: 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; beginMediaPlayer.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 usesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Forms, Dialogs, MPlayer, MMSystem; typeTNickMediaPlayer = 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;beginRegisterComponents('Samples', [TNickMediaPlayer]);end; function TNickMediaPlayer.DeleteWaveChunk(aFrom, aTo: LongInt): Longint;varDeleteParms: TMCI_WAVE_DELETE_PARMS;Flags: LongInt;beginFlags := 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 [000825]