Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Скорость воспроизведения аудио (замедлен. и ускор)


Автор: XAKEPEHOK 21.10.2009, 21:24
Всем добрый день! Подскажите пожалуйста, как реализовать динамическое изменение скорости воспроизведения аудио?
Нашел такой код. Работает простое замедление и ускорение, но мне надо чтобы во время воспроизведения скорость можно было бы менять
Код

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.

Автор: XAKEPEHOK 22.10.2009, 17:58
Бошку ломаю, нифига не получается. Я понимаю тут не более чем 3 строчки будет.

Код

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
form1.Caption:=inttostr(TrackBar1.Position);
k_Wave:=TrackBar1.Position;
waveOutPrepareHeader(hzv, @hider, SizeOf(hider));
waveOutOpen(@hzv, WAVE_MAPPER, @format, 0, 0, CALLBACK_NULL);
waveOutWrite(hzv, @hider, SizeOf(hider));
end;


Но это не работает =(

Автор: Alexeis 22.10.2009, 19:30
Цитата(XAKEPEHOK @  21.10.2009,  20:24 Найти цитируемый пост)
format.nAvgBytesPerSec:=fl.Size;

Тут явно косяк

Цитата(http://forum.vingrad.ru/topic-89826.html)

- Поле dwAvgBytesPerSec указывает, сколько байтов проигрываются каждую секунду. dwAvgBytesPerSec может использоваться приложением, чтобы оценить, буфер какого размера необходим, для того чтобы должным образом воспроизводить звук без проблем связанных с прерыванием воспроизведения звука. Его значение должно быть равно результату произведения dwSamplesPerSec * wBlockAlign округленного в большую сторону.


Предполагаю что сначала нужно остановить воспроизведение, подготовить новый кусок, поправить структуру
Код

format.nSamplesPerSec:=round((k_Wave / 50)*44100);
format.nAvgBytesPerSec:=fl.Size;

затем уже 
Код

waveOutOpen(@hzv, WAVE_MAPPER, @format, 0, 0, CALLBACK_NULL);
waveOutPrepareHeader(hzv, @hider, SizeOf(hider));
waveOutWrite(hzv, @hider, SizeOf(hider));




Автор: XAKEPEHOK 23.10.2009, 09:47
В таком случае при попытке изменить позицию TrackBar'a вылетает Access violation at address 047CDE38. Write of address 00426EF1.

Автор: Alexeis 23.10.2009, 10:22
XAKEPEHOK, в каком таком случае? Такое возникает в любом случае если в коде есть косяк с памятью smile .

Добавлено через 5 минут и 23 секунды
Я думаю что правильнее всего будет воспользоваться этой функцией http://msdn.microsoft.com/en-us/library/dd743873%28VS.85%29.aspx

Автор: XAKEPEHOK 23.10.2009, 19:16
Спасибо! Нашел альтернативный метод. Компонент DsMixer. Прилагаю

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)