微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过远程桌面访问PC的音频输入进行录制?

如何解决如何通过远程桌面访问PC的音频输入进行录制?

| 我正在用Borland Turbo C ++(2006)编写一个应用程序,该应用程序在Windows XP Pro下运行,我想在其中将音频输入记录到数据缓冲区中,以便随后可以对时间响应进行FFT。 当应用程序在本地运行时,以下代码可以正常工作:
short int       pluck_data[T_SAMPLES][CHANNELS];

//---------------------------------------------------------------------------

int __fastcall CheckResult(char* func_name,int result)
{
  int   return_value = 1;           // set return_value for fail by default
  char  msg[100];

  if(result == MMSYSERR_NOERROR)    // function call returned without error
    return_value = 0;
  else                              // function call returned error
  {
    switch(result)
    {
      case MMSYSERR_ALLOCATED:
        sprintf(msg,\"%s: Specified resource is already allocated.\",func_name);
        break;
      case MMSYSERR_BADdeviceid:
        sprintf(msg,\"%s: Specified device identifier is out of range.\",func_name);
        break;
      case MMSYSERR_INVALHANDLE:
        sprintf(msg,\"%s: Specified device handle is invalid.\",func_name);
        break;
      case MMSYSERR_NODRIVER:
        sprintf(msg,\"%s: No device driver is present.\",func_name);
        break;
      case MMSYSERR_NOMEM:
        sprintf(msg,\"%s: Unable to allocate or lock memory.\",func_name);
        break;
      case WAVERR_BADFORMAT:
        sprintf(msg,\"%s: Attempted to open with an unsupported waveform-audio format.\",func_name);
        break;
      case WAVERR_STILLPLAYING:
        sprintf(msg,\"%s: The buffer pointed to by the pwh parameter is still in the queue.\",func_name);
        break;
      case WAVERR_UNPREPARED:
        sprintf(msg,\"%s: The buffer pointed to by the pwh parameter hasn\'t been prepared.\",func_name);
        break;
      default:
        sprintf(msg,\"%s: UnkNown error.\",func_name);
    }
    ReportError(hWnd,msg,log_fptr);
  } // else function call returned error
  return return_value;
}

//---------------------------------------------------------------------------

int __fastcall RecordString()
{
  int           return_value = 1;           // set return_value for fail by default
  WAVEINCAPS    dev_capability;
  HWAVEIN       dev_handle;
  WAVEFORMATEX  rec_format;
  WAVEHDR       rec_header;
  int           result;
  char          msg[100];

  result = waveInGetNumDevs();      // get number of audio input devices
  if(result != 1)
  {
    if(result == 0)
      sprintf(msg,\"No waveform-audio input devices present.\");
    else
      sprintf(msg,\"More than one waveform-audio input device present.\");
    ReportError(hWnd,log_fptr);
  }
  else
  {
    // only 1 audio input device; test its capabilities
    result = waveInGetDevCaps(0,&dev_capability,sizeof(dev_capability));
    if(CheckResult(\"waveInGetDevCaps\",result) == 0)
    {
      // test if device supports 96kHz,Stereo,16-bit format WAVE_FORMAT_96S16
      if ((dev_capability.dwFormats & WAVE_FORMAT_96S16) == 0)
      {
        sprintf(msg,\"waveInGetDevCaps: WAVE_FORMAT_96S16 not supported\");
        ReportError(hWnd,log_fptr);
      }
      else
      {
        // initialise required record format
        rec_format.wFormatTag = WAVE_FORMAT_PCM;
        rec_format.nChannels = CHANNELS;                                    // 2
        rec_format.nSamplesPerSec = SAMPLE_RATE;                            // 96000
        rec_format.nAvgBytesPerSec = BYTES_PER_SAMPLE * SAMPLE_RATE;        // 384000
        rec_format.nBlockAlign = BYTES_PER_SAMPLE;                          // 4
        rec_format.wBitsPerSample = SAMPLE_BITS;                            // 16
        rec_format.cbSize = 0;
        // open audio input device requesting format 96kHz,16-bit
        result = waveInopen(&dev_handle,WAVE_MAPPER,&rec_format,0);
        if(CheckResult(\"waveInopen\",result) == 0)
        {
          // initialise header for data buffer
          rec_header.lpData = (char*)&pluck_data;
          rec_header.dwBufferLength = sizeof(pluck_data);
          rec_header.dwFlags = 0;
          // prepare header for data buffer
          result = waveInPrepareHeader(dev_handle,&rec_header,sizeof(rec_header));
          if(CheckResult(\"waveInPrepareHeader\",result) == 0)
          {
            // connect data buffer to audio input device
            result = waveInAddBuffer(dev_handle,sizeof(rec_header));
            if(CheckResult(\"waveInAddBuffer\",result) == 0)
            {
              // start recording
              result = waveInStart(dev_handle);
              if(CheckResult(\"waveInStart\",result) == 0)
              {
                // recording - poll flag until data buffer full
                while((rec_header.dwFlags & WHDR_DONE ) == 0); // wait for flag to be set
                // buffer Now full
                // reset/stop recording
                result = waveInReset(dev_handle);
                if(CheckResult(\"waveInReset\",result) == 0)
                {
                  // unprepare header for data buffer
                  result = waveInUnprepareHeader(dev_handle,sizeof(rec_header));
                  if(CheckResult(\"waveInUnprepareHeader\",result) == 0)
                  {
                    // close audio input device
                    result = waveInClose(dev_handle);
                    if(CheckResult(\"waveInClose\",result) == 0)
                      return_value = 0;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return return_value;
}
但是,如果我尝试通过远程桌面(从运行Win XP Home的PC上)运行该程序,对waveInGetNumDevs()的调用将返回零。 另外,我从RecordString()函数删除了对waveInGetNumDevs(),waveInGetDevCaps()和waveInopen()的调用,而是在程序启动时仅运行一次。 (也从RecordString()中删除了对waveInClose()的调用。)现在,如果我在主机PC上启动程序,以便它成功调用了waveInopen()并检索了音频输入设备的句柄(HWAVEIN dev_handle),然后,我可以切换到通过远程桌面访问该主机PC(程序仍在运行时),而RecordString()函数仍然可以正常运行。因此,一旦获得设备句柄,似乎可以通过远程桌面获得音频输入。问题出在手柄上。 有没有一种方法可以使我通过远程桌面运行整个应用程序,而不必在主机PC上本地启动它?     

解决方法

        我找到了答案,这要归功于:http://www.wikihow.com/Hear-Audio-from-the-Remote-PC-when-Using-Remote-Desktop 启动远程桌面时,单击“选项”按钮,然后选择“本地资源”选项卡,并确保将“远程计算机声音”设置为“留在远程计算机上”。 通过远程桌面运行时,问题中显示的原始代码现在可以正常工作。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。