Jak nagrywać na raz dźwięki z mikrofonu i głośników za pomocą biblioteki bass?? Próbowałem na wiele sposobów ale za każdym razem nagrywało mi tylko to co jest na drugim kanale [glowa] .
Z góry dziękuję za pomoc :-)
Pozdrawiam Magx2
<ort>na pewno </ort>da się nagrywać <ort>po prostu </ort>podczas wybierania urządzenia w jednym kanale ustaw żeby nagrywał z mikrofonu a w drugim bodajże opcja "Mix Stereo" albo "Wave Out Mix" czy jakoś tak i po problemie. Co do samego nagrywania to jak pobierzesz bass.dll to masz tam przykład jak nagrywać z dowolnego źródła wystarczy że przerobisz żeby nagrywał z dwóch jednocześnie a da się to zrobić bo sam coś takiego pisałem i nagrywałem z 8 różnych źródeł.
Ja też właśnie przerabiam ten plik z przykładów.
Tylko nie wiem jak włączyć żeby na 2 kanały nagrywało. Mam taki o kod:
(* Start recording to memory *)
procedure TNagrywarka.StartRecording;
var
i : Integer;
Data : String;
begin
if ComboBox1.ItemIndex < 0 then Exit; //tutaj jest mix stereo
if ComboBox2.ItemIndex < 0 then Exit; //tutaj jest mikrofon
if WaveStream.Size > 0 then
begin // free old recording
BASS_StreamFree(chan);
WaveStream.Clear;
end;
// generate header for WAV file
with WaveHdr do
begin
riff := 'RIFF';
len := 36;
cWavFmt := 'WAVEfmt ';
dwHdrLen := 16;
wFormat := 1;
wNumChannels := 2;
dwSampleRate := 44100;
wBlockAlign := 4;
dwBytesPerSec := 176400;
wBitsPerSample := 16;
cData:= 'data';
dwDataLen := 0;
end;
WaveStream.Write(WaveHdr, SizeOf(WAVHDR));
i:= 0;
while BASS_RecordSetInput(i, BASS_INPUT_OFF) do Inc(i);
BASS_RecordSetInput(ComboBox1.ItemIndex, BASS_INPUT_ON);
BASS_RecordSetInput(ComboBox2.ItemIndex, BASS_INPUT_ON); //Teraz jak włączam nagrywanie to nagrywa tylko z tego drugiego źródła
// start recording @ 44100hz 16-bit stereo
rchan:= BASS_RecordStart(44100, 2, 0, @RecordingCallback, 0);
if rchan = 0 then
begin
MessageDlg('Nie moge rozpocząc nagrywania.', mtError, [mbOk], 0);
WaveStream.Clear;
end else
begin
SBPlay.Enabled := False;
SBSave.Enabled := False;
SBRec.Glyph.LoadFromFile(ExtractFilePath(Application.ExeName) + '/images/Rec_2.bmp');
end;
end;
Próbowałem nagrywać z 2 strumieniami ale wtedy około co 1 sec przerywało. Jak mógłbyś wstawić jakiś kod czy coś.
Dzięki za poświęcenie swojego czasu :).
Powiem ci dlaczego ci nie nagrywa tak jak potrzeba. Jak zainicjujesz nagrywanie ze źródł np. 0 to potem ustawiasz mu z którego wejśca ma nagrywać. I tu jest twój problem bo najpierw ustawiasz że z mikrofonu a następnie zmieniasz na Mix Stereo (czy na odwrót nieważne :) ). Musiałbyś zainicjować nagrywanie dwa razy za każdym razem z innym wejściem. Ja nie miałem tego problemu bo używałem kilku różnych źródeł a wejście zawsze było takie samo (mikrofon) nie jestem teraz w domu ale jak będę wieczorem to sprubuje to zrobić u siebie. A na razie masz fragment mojego programu odpowiadający za nagrywanie, może coś wymyślisz do tego czasu:
Var
RChan: array [0..5] of HRECORD;
procedure TForm1.StartRecord(UserI: Integer);
Var
Commands, FileName : String;
Dev, Inp, Lev, I, X: Integer;
begin
Dev := 0; //Ustawiasz z którego źródła ma nagrywać
Inp := 0; //Które wejście
Lev := 1; //Poziom nagrywania
if BASS_RecordInit(Dev) then BASS_RecordFree();
BASS_RecordInit(Dev);
I := 0;
while BASS_RecordSetInput(i, BASS_INPUT_OFF, -1) do Inc(I);
BASS_RecordSetInput(Inp, BASS_INPUT_ON, Lev);
RChan[UserI] := BASS_RecordStart(44100, 1, BASS_RECORD_PAUSE, @RecordingCallback, 0);
if RChan[UserI] = 0 then begin
ShowMessage('Nie można rozpocząć nagrywania. Sprawdź czy urządzenie jest podłączone prawidłowo.');
Exit;
end;
FileName := 'Nazwa pliku.mp3'
Commands := 'lame.exe -b 96 - ' + FileName;
if (BASS_Encode_Start(RChan[UserI], PChar(Commands), BASS_ENCODE_AUTOFREE, nil, 0) = 0) then
begin
ShowMessage('Błąd...');
BASS_ChannelStop(RChan[UserI]);
RChan[UserI] := 0;
Exit;
end;
BASS_ChannelPlay(RChan[UserI], FALSE);
BASS_RecordSetInput(ComboBox1.ItemIndex, BASS_INPUT_ON, 0); // tutaj jak dodałem ", 0" to jest błąd że za dużo parametrów?? O co chodzi?? U ciebie to działa
BASS_RecordSetInput(ComboBox2.ItemIndex, BASS_INPUT_ON, 1); //j.w.
@Edit
Już działa :).
A zrobiłem tak:
BASS_RecordInit(0);
BASS_RecordSetInput(ComboBox1.ItemIndex, BASS_INPUT_ON);
BASS_RecordInit(1);
BASS_RecordSetInput(ComboBox2.ItemIndex, BASS_INPUT_ON);