Всем добрый день! Подскажите пожалуйста, как реализовать динамическое изменение скорости воспроизведения аудио? Нашел такой код. Работает простое замедление и ускорение, но мне надо чтобы во время воспроизведения скорость можно было бы менять
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, mmsystem, ComCtrls;
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; TrackBar1: TTrackBar; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure TrackBar1Change(Sender: TObject); private { Private declarations } public { Public declarations } end;
var k_Wave: word; Form1: TForm1; format:TWaveFormatEx; hzv:HWaveOut; hider:WaveHdr; buf:PChar; fl:TMemoryStream;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin fl:=TMemoryStream.Create; fl.LoadFromFile('D:\123.wav'); buf:=StrAlloc(fl.Size); fl.Read(buf^, fl.Size); format.wFormatTag:=WAVE_FORMAT_PCM; format.nChannels:=2; format.nSamplesPerSec:=round((k_Wave / 50)*44100);//нормальная скорость (для увеличения коэффициент k*44100) format.nAvgBytesPerSec:=fl.Size; format.nBlockAlign:=4; format.wBitsPerSample:=16; format.cbSize:=0; waveOutOpen(@hzv, WAVE_MAPPER, @format, 0, 0, CALLBACK_NULL); hider.lpData:=@buf^; hider.dwBufferLength:=fl.Size; fl.Free; waveOutPrepareHeader(hzv, @hider, SizeOf(hider)); waveOutWrite(hzv, @hider, SizeOf(hider)); end;
procedure TForm1.Button2Click(Sender: TObject); begin waveOutPause(hzv); waveOutUnPrepareHeader(hzv, @hider, SizeOf(hider)); waveOutClose(hzv); StrDispose(buf); end;
procedure TForm1.TrackBar1Change(Sender: TObject); begin k_Wave:=TrackBar1.Position; format.nSamplesPerSec:=round((k_Wave / 50)*44100);//нормальная скорость (для увеличения коэффициент k*44100) end;
end.
|
|