我想编写一个程序,能通过局域网络实时把一台电脑的MIC 声音传到其他电脑,如何编写接收和发送程序

解决方案 »

  1.   

    用socketserver socketclient 实现网络传输。
    var
        FileSize,i,Reclen,diff:Longint;
      P:Pointer;
      TempFile:Integer;
      Str:Array [0..80] of Char;
    begin
      StopPlaying;
        btnStop.Enabled := True;
        Sel1 := 0;
        Sel2 := 0;
        ReallocMem(wavebuf,0);
        Tracker.Position := 0;
        Tracker.Max := 0;
        ReallocMem(pfmt,0);
        ReallocMem(pfmt,sizeof(pfmt^));
        pfmt^.nChannels := 1;
        pfmt^.nSamplesPerSec := 8000;
        pfmt^.nAvgBytesPerSec := 16000;
        pfmt^.wBitsPerSample := 16;
        pfmt^.nBlockAlign := 2;
        pfmt^.wFormatTag := 1;
        pfmt^.cbSize := 0;
        EditFileName :=SaveDialog.InitialDir+'NONAME.VOC';
        TempFile := FileCreate(SaveDialog.InitialDir+'vtemp.lin');
        Caption := '正在录音:['+EditFileName+']';
        //---------------------------------------------------------------------
        wavelen := 0;
        //ReallocMem(P,160000);
        wfx.wFormatTag:=WAVE_FORMAT_PCM;
        wfx.nChannels := 1;
        wfx.nSamplesPerSec :=  8000;
        wfx.nAvgBytesPerSec := 16000;
        wfx.wBitsPerSample := 16;
        wfx.nBlockAlign := 2;
        wfx.cbSize := 0;
        CheckError(waveInOpen(@hwi,WAVE_MAPPER,@wfx,0,0,CALLBACK_NULL));    ReallocMem(wavebuf,8000);    wh.lpData:=wavebuf;
        wh.dwBufferLength:=8000;
        wh.dwFlags := 0; // must be 0
        CheckError(waveInPrepareHeader(hwi,@wh,sizeof(TWAVEHDR)));    CheckError(waveInAddBuffer(hwi,@wh,sizeof(TWAVEHDR)));    CheckError(waveInStart(hwi));
        Recording := True;
        Modified := True;
        FileSize := 0;
        while((not btnStop.Down) And (Recording)) do
        begin
          Application.ProcessMessages;
          if (wh.dwFlags and WHDR_DONE)<>0 then
          begin
            tm.wType:=TIME_BYTES;
            CheckError(waveInGetPosition(hwi,@tm,sizeof(TMMTime)));
            diff := longint(tm.cb)-FileSize;
            wavelen := diff;
            FileSize := longint(tm.cb);
            Flag := (diff) div 2 div DrawBox.ClientWidth+1;
            if Flag<=0 then Flag := 1;
            DrawCurve(Flag,StartPos);
            FileWrite(TempFile,wavebuf^,diff);
            lblWaveLen.Caption := Format('%0.2f', [FileSize / 16000])+'秒';
            CheckError(waveInAddBuffer(hwi,@wh,sizeof(TWAVEHDR)));
           end;
        end;
        CheckError(waveInStop(hwi));
        CheckError(waveInReset(hwi));
        CheckError(waveInUnPrepareHeader(hwi,@wh,sizeof(TWAVEHDR)));
        ReallocMem(wavebuf,0);
        CheckError(waveInClose(hwi));    FileSeek(TempFile,0,0);
        ReallocMem(wavebuf,FileSize);
        FileRead(tempFile,wavebuf^,FileSize);
        wavelen := FileSize;
        Flag := wavelen div 2 div DrawBox.ClientWidth+1;
        if Flag<=0 then Flag := 1;
        DrawCurve(Flag,StartPos);
        Recording := False;
        FileClose(tempFile);
        DeleteFile(SaveDialog.InitialDir+'vtemp.lin');这是一段录音的代码
    调整   wh.dwBufferLength:=8000;
    这是缓存区大小
    减小缓存区大小
    搞双缓冲可以提高实时性
      

  2.   

    直接传太大了,使用msacm吧。有一些延迟,但是占用带宽很低,用起来很爽,刚刚写过一个这样的程序。
      

  3.   

    有demo吗???
    大家一起学习一下吗!!![email protected]
      

  4.   

    for d6 or d7 的 msacm的控件及Demo有吗?
    [email protected] 3Q
      

  5.   

    msacm好像只是一个文件头, 高手请教使用方法 [email protected]
      

  6.   

    可以给我一个例子吗?谢了!![email protected]