【问题标题】:How to adjust audio panning with RtAudio如何使用 RtAudio 调整音频平移
【发布时间】:2012-10-25 22:28:31
【问题描述】:

我使用 Rtaudio 库,我想实现一个可以控制平移的音频程序(例如,将声音从左声道转移到右声道)。

在我的具体情况下,我使用双工模式(您可以在此处找到示例:duplex mode)。这意味着我将麦克风输入链接到扬声器输出。

我应该在输出缓冲区上应用过滤器吗?什么样的过滤器?
谁能帮帮我?

【问题讨论】:

    标签: c++ audio duplex audio-panning rtaudio


    【解决方案1】:

    要减少左边的信号,只需将左边的每个样本乘以一个小于或等于 1 的数字,我们称之为 l。同样对于右边,我们将这个数字称为 r。一般来说,您不想乘以大于 1 的数字,否则可能会导致信号失真。

    l 和 r 都是“平移位置”的函数。你如何从平移位置到你的数字是一些讨论的问题。如果这是为了简单的事情,您可以将这些值线性降低,在极端情况下使用这些值:

    Hard Left:
    l=1; r=0
    Center:
    l=1; r=1
    Hard Right:
    l=0; r=1;
    

    如果这是更高级的东西,你应该在谷歌上搜索“pan law”。下面是一个看起来不错的示例:

    http://www.kvraudio.com/forum/viewtopic.php?p=4264576

    更新: 我从未使用过 RT 音频(我通常使用类似的 PortAudio),但我认为平移代码看起来像这样,其中 l 和 r 如上定义(假设类型 int32_t - 有符号 32 位整数):

    int inout( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
               double streamTime, RtAudioStreamStatus status, void *data )
    {
      if ( status ) std::cout << "Stream over/underflow detected." << std::endl;
    
      int32_t *ob = (int32_t *)outputBuffer;
      int32_t *in = (int32_t *)inputBuffer;
    
      unsigned long *bytes = (unsigned long *) data;
      int i =0;
      while( i < bytes / 4 ) {
         ob[i] = (int32_t) ( ib[i] * l + .5 );
         ++i;
         ob[i] = (int32_t) ( ib[i] * r + .5 );
         ++i;
      }
      return 0;
    }
    

    【讨论】:

    • 其实这不是我需要的。如果从双工模式示例开始,我在函数 inout 中有一个音频 *outputBuffer。如何修改该缓冲区以进行平移?我的意思是一个简单的 2D 音频平移
    • 我添加了一些示例代码,不确定它是否正确,但它会给你一个想法。使用我认为 RtAudio 支持的浮点数据可能更容易。另外,仅供参考,大多数人都说 2D 平移,所以没有混淆,但它确实是 1D。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 2023-03-13
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    相关资源
    最近更新 更多