Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скорость воспроизведения аудио (замедлен. и ускор), Как реализовать? 
V
    Опции темы
XAKEPEHOK
Дата 21.10.2009, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.10.2006
Где: Matrix

Репутация: нет
Всего: 0



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

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 - 21.10.2009, 23:25
PM ICQ   Вверх
XAKEPEHOK
Дата 22.10.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.10.2006
Где: Matrix

Репутация: нет
Всего: 0



Бошку ломаю, нифига не получается. Я понимаю тут не более чем 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:19
PM ICQ   Вверх
Alexeis
Дата 22.10.2009, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(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));






--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
XAKEPEHOK
Дата 23.10.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.10.2006
Где: Matrix

Репутация: нет
Всего: 0



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

Это сообщение отредактировал(а) XAKEPEHOK - 23.10.2009, 09:48
PM ICQ   Вверх
Alexeis
Дата 23.10.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



XAKEPEHOK, в каком таком случае? Такое возникает в любом случае если в коде есть косяк с памятью smile .

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
XAKEPEHOK
Дата 23.10.2009, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.10.2006
Где: Matrix

Репутация: нет
Всего: 0



Спасибо! Нашел альтернативный метод. Компонент DsMixer. Прилагаю

Это сообщение отредактировал(а) XAKEPEHOK - 23.10.2009, 19:17

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  18_DsMixer.zip 799,42 Kb
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.