Как обрабатывать аудиоданные с выхода звуковой карты с помощью Bass.NET

Я хочу, чтобы захватывать и обрабатывать данные с помощью Bass.NET с помощью метода BASS_ChannelGetData. Примеры, которые я видел, которые используют это, воспроизводят аудиофайлы через библиотеку Bass.NET, а затем сэмплируют это, однако я хочу сэмплировать данные, выводимые моей звуковой картой, чтобы я мог захватывать и обрабатывать аудиоданные от сторонних аудиоплееров, для пример Spotify.

Bass.BASS_ChannelGetData(handle, buffer, (int)BASSData.BASS_DATA_FFT256);

Как бы я получить ручку, которая позволит мне обрабатывать эти данные?

1 ответ

Bass.BASS_RecordInit действительно возвращает дескриптор, но если вы внимательно посмотрите на документацию, они используют его только для воспроизведения (фактически запуска) канала записи. Их пример кода использует обратный вызов для извлечения аудиосэмплов.

Взгляните на документацию по Bass.BASS_RecordStart.

private RECORDPROC _myRecProc; // make it global, so that the GC can not remove it 
private int _byteswritten = 0;
private byte[] _recbuffer; // local recording buffer
...
if ( Bass.BASS_RecordInit(-1) )
{
  _myRecProc = new RECORDPROC(MyRecording);
  int recHandle = Bass.BASS_RecordStart(44100, 2, BASSFlag.BASS_RECORD_PAUSE, _myRecProc, IntPtr.Zero);
  ...
  // start recording
  Bass.BASS_ChannelPlay(recHandle, false);
}
...
private bool MyRecording(int handle, IntPtr buffer, int length, IntPtr user)
{
  bool cont = true;
  if (length > 0 && buffer != IntPtr.Zero)
  {
    // increase the rec buffer as needed 
    if (_recbuffer == null || _recbuffer.Length < length)
      _recbuffer = new byte[length];
    // copy from managed to unmanaged memory
    Marshal.Copy(buffer, _recbuffer, 0, length);
    _byteswritten += length;
    // write to file
    ...
    // stop recording after a certain amout (just to demo) 
    if (_byteswritten > 800000)
      cont = false; // stop recording
  }
  return cont;
}

Обратите внимание, что вы должны иметь возможность использовать BASS_ChannelGetData внутри этого обратного вызова вместо Marshal.Copy.

Вы имели в виду resample вместо sample? Если так, то класс BassMix справится с этой задачей.

Другие вопросы по тегам