Results 1 to 7 of 7

Thread: Audio Streamen Problem

  1. #1

    Question Audio Streamen Problem

    Hi Everyone, Ik heb een probleem die ik al meer dan een week niet kon oplossen en daarom heb ik hulp nodig .

    Ik probeer de Audio(Microfoon) te streamen van server naar client.
    Ik stuur data naar de server en het wordt doorgevoerd alleen krijg ik BufferFull procedure niet aan het werk!


    Client Code:
    Code:
    // READ STREAM DATA AUDIO
    procedure TFrmAudio.ParseData(Data: string);
    var
      Stream: TMemoryStream;
      Li: TListItem;
    begin
    
      if CheckBox1.Checked then ACMO.Play(pointer(Data)^,length(data));
    
      Stream := TMemorystream.Create;
      stream.Write(pointer(Data)^,length(data));
      li := ListView2.Items.Add;
      li.Caption := inttostr(ListView2.Items.Count);
      li.SubItems.Add(inttostr(stream.Size));
      li.SubItems.Add(timetostr(time));
      li.Data := stream;
      li.ImageIndex := 0;
    
    end;
    
    // BEGIN AUDIO STREAM
    procedure TFrmAudio.BtnStartClick(Sender: TObject);
    var
      Format: TWaveFormatEx;
      Stream: TMemoryStream;
      Command: string;
    begin
      if not assigned(Listview1.Selected) then begin
        Listview1.Items[9].Selected := True;
      end;
    
      Listview2.Clear;
    
      if Listview1.Selected.SubItems[0] = 'Stereo' then Format.nChannels := 2
      else Format.nChannels := 1;
    
      Format.nSamplesPerSec := StrToInt(Listview1.Selected.Caption);
    
      Format.wBitsPerSample := 16;
      Format.nAvgBytesPerSec := Format.nSamplesPerSec * Format.nChannels * 2;
      Format.nBlockAlign := Format.nChannels * 2;
    
      ACMC.FormatIn.Format.nChannels := Format.nChannels;
      ACMC.FormatIn.Format.nSamplesPerSec := Format.nSamplesPerSec;
      ACMC.FormatIn.Format.nAvgBytesPerSec := Format.nAvgBytesPerSec;
      ACMC.FormatIn.Format.nBlockAlign := Format.nBlockAlign;
      ACMC.FormatIn.Format.wBitsPerSample := Format.wBitsPerSample;
    
      Stream := TMemoryStream.Create;
      Stream.WriteBuffer(Format, SizeOf(TWaveFormatEx));
      SetString(Command,pchar(Stream.memory),Stream.Size);
      Stream.Free;
    
      //Messagebox(0,pchar(Command),0,0);
        If SendPacket(sSocket, C_REQUESTAUDIO, Command) then begin
          Statusbar1.Panels.Items[0].Text := 'Audio Activated!';
        end else begin
          Statusbar1.Panels.Items[0].Text := 'Socket Error!';
        end;
      //SendData(NewSocket,'Start|' + Command);
    
      Listview1.Enabled := False;
      BitBtn2.Enabled := False;
      BitBtn3.Enabled := True;
    
    end;
    
    procedure TFrmAudio.FormCreate(Sender: TObject);
    begin
      ACMO := TACMOut.Create(nil);
      ACMC := TACMConvertor.Create;
      ACMO.NumBuffers := 0;
      ACMO.Open(ACMC.FormatIn);
    end;
    Server Code:
    Code:
    procedure ParseData(Socket: TClientSocket; Data: string);
    var
      Command: string;
      Stream: TMemorySTream;
      Format: TWaveFormatEx;
    begin
    
        STream := TMemoryStream.Create;
        Stream.Write(pointer(Data)^,Length(Data));
        Stream.Position := 0;
        Stream.ReadBuffer(Format, SizeOf(TWaveFormatEx));
        Stream.Free;
    
        Main := TMain.Create;
        Main.Socket := Socket;
        ACMC := TACMConvertor.Create;
        ACMI := TACMIn.Create;
        ACMI.OnBufferFull := Main.BufferFull;
        //ACMC.InputBufferSize := 4096; //176400;
        ACMI.BufferSize := ACMC.InputBufferSize;
        ACMC.FormatIn.Format.nChannels := Format.nChannels;
        ACMC.FormatIn.Format.nSamplesPerSec := Format.nSamplesPerSec;
        ACMC.FormatIn.Format.nAvgBytesPerSec := Format.nAvgBytesPerSec;
        ACMC.FormatIn.Format.nBlockAlign := Format.nBlockAlign;
        ACMC.FormatIn.Format.wBitsPerSample := Format.wBitsPerSample;
        ACMC.InputBufferSize := ACMC.FormatIn.Format.nAvgBytesPerSec;
        ACMI.BufferSize := ACMC.InputBufferSize;
        ACMC.Active := True;
        ACMI.Open(ACMC.FormatIn);
    Form1.Memo1.Lines.Add('ParseData Socket: '+intToStr(Socket.Socket));
    end;
    
    procedure TMain.BufferFull(Sender: TObject; Data: Pointer; Size: Integer);
    var
      NewSize: Integer;
      Stream: TMemoryStream;
      Text: string;
    begin
    Form1.Memo1.Lines.Add('BufferFull: '); // DIT WERK NIET 
      Move(Data^, ACMC.BufferIn^, Size);
      NewSize := ACMC.Convert;
    
      Stream := TMemoryStream.Create;
      Stream.WriteBuffer(ACMC.BufferOut^, NewSize);
      Stream.Position := 0;
      SetLength(Text,Stream.Size);
      Stream.ReadBuffer(pointer(Text)^,Stream.Size);
      Stream.SaveToFile('D:\' + inttostr(gettickcount));
      Stream.Free;
    
      //SetString(Text,pchar(ACMC.BufferOut^),NewSize);
    
      SendData(Socket,Text);
    end;

  2. #2
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Even snel kijkende: je event OnBufferFull gaat kennelijk niet af. (ik ga ervan uit dat je "Main" variabele deugt).
    Ik zou mij nog kunnen voorstellen dat het zou kunnen helpen deze event zo laat mogelijk te zetten (na het zetten van alle properties en vlak voor het lezen/openen). Maar niet waarschijnlijk.
    De enige link die ik (even snel) kon vinden is hier. Misschien ben je niet de enige...
    https://www.opensc.io/showthread.php?t=19069

  3. #3
    het werkt ook niet, bij mij gaat het OnBufferFull niet aan waardoor geen audio data doorgestuurd wordt naar de client.

    dank u

  4. #4
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Als een event niet getriggerd wordt, moet je dus eigenlijk de code van het component dat daar verantwoordelijk is
    doorlopen terwijl je code draait.
    Genoemde component heb ik niet geïnstalleerd staan, dus ik kan niet met je meekijken.
    TMemoryLeak.Create(Nil);

  5. #5
    Ik gebruik geen component voor het extracten van audio microfoon , ik heb hier het project(Client/Server) gezet als je tijd hebt om naar te kijken.

    Dank u

    http://www.mediafire.com/file/vm60jz..._CHAT.rar/file

    Forum laat mij geen bestanden uploaden met meer dan 100kb

  6. #6
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Quote Originally Posted by Akama View Post
    meer dan 100kb
    Dat geldt ook eigenlijk als een hint: dit is een Delphi (programmeer) forum: we zetten hier alleen code neer
    waarin zaken fout gaan, niet hele projecten.

    Dat is trouwens sowieso het eerste waar je mee moet beginnen bij een groot probleem waar je maar niet
    achter kan komen: het isoleren van probleemcode in een nieuw, geheel losstaand project, zodat je niet wordt
    afgeleid door code om het eigenlijke probleem heen.
    TMemoryLeak.Create(Nil);

  7. #7
    Dank u. Ik heb het hele project opgezet om te laten zien dat het niet om een component gaat. Nogmaals bedankt

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •