Jak nagrywać dźwięk tak, by mieć kontrole nad buforem w czasie rzeczywistym?
10:13Wed, 3 January 2007 Pytanie:
interesuje mnie zaawansowane nagrywanie dźwięku w sposób, by mieć kontrole nad buforem (móc go modyfikować) w czasie rzeczywistym. Dodam, że korzystałem z pakietu DSPack, w którym jest możliwość dostępu do bufora w czasie rzeczywistym, ale według moich doświadczeń nie można go w danej chwili modyfikować. Również DSPack niekiedy się troszkę sypie przy tego typu operacjach (np. niemożność odczytania prawdziwego rozmiaru strumienia będącego buforem podczas działań na nim [może nie tyle niemożność co jego nieprawidłowy rozmiar]). Interesują mnie rozwiązania w czystym API, w DirectX (mam przetłumaczone nagłówki) lub komponenty (o ile takie istnieją).
Z góry dziękuję wszystkim za pomoc, będę wdzięczny za jakiekolwiek odpowiedzi.
Łukasz.
Odpowiedź:
Wszystkich zainteresowanych tematem odsyłam do strony http://www.un4seen.com/ na której znajduje się biblioteka DLL o nazwie BASS, wraz z przetłumaczonymi nagłówkami dla Delphi (tak więc normalna w użyciu, nie trzeba ręcznie wyławiać funkcji z biblioteki DLL). Ma ona ogromne możliwości, jest bardziej dopracowana niż część audio paczki DSPack (nie występują w niej podobne problemy), jest szybsza, łatwiejsza w obsłudze, bezpłatna do niekomercyjnych zastosowań. Dodatkowo dołączony przykład o nazwie RecordTest pokazuje jak można nagrywać za pomocą BASS.
Udało mi się za jej pomocą zmodyfikować bufor w czasie rzeczywistym (dla chętnych podaje przykład zmienionej procedury "RecordingCallback" znajdującej się w przykładzie RecordTest, która modyfikuje nagrywany dźwięk w czasie rzeczywistym):
function RecordingCallback(Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean; stdcall;
var
i : integer;
probka : ^byte;
begin
// Modyfikacja bufora
for i:=0 to length-1 Do
begin
probka := Pointer(Integer(buffer)+i);
// Teraz zmienna probka^ stanowi pojedynczą próbkę którą możemy dowolnie modyfikować
probka^ := probka^ div 2;
end;
// Koniec modyfikacji bufora
// Kopiuje bufor (zmienna buffer) do strumienia zawierającego dźwięk (zmienna WaveStream)
Form1.WaveStream.Write(buffer^, length);
// Allow recording to continue
Result := True;
end;
Póki co brak pytań w FAQ.Skomentuj
Aby zamieścić komentarz, proszę włączyć JavaScript - niestety roboty spamujące dają mi niezmiernie popalić.
Komentarze czytelników
Nie ma jeszcze żadnych komentarzy.