audio - FMOD 环绕声开放框架

标签 audio openframeworks fmod surround

好的,我希望我不要搞砸了,我已经寻找了一些答案,但找不到任何东西。我正在尝试在 3D 模式下使用 FMOD 声音播放器在 openframeworks 中制作一个简单的采样器。我可以使单个实例正常工作(使用 libsndfilerecorder 录制一个新文件,然后播放它并在环绕中移动它。

但是,我想要 8 层循环音频,我可以在现场表演中一次录制和替换一层。一旦我有超过 1 层,我就会遇到很多问题。

我的问题的第一部分与 FMOD 3D 模式有关,它是相对于听者的,所以我必须为每个声音定义听者的位置(我更喜欢头部相对模式,但我根本无法做到这一点。再次当我使用单个播放器但使用多个播放器时,这工作正常,只有我更新的最后一个监听器实际工作。

我遇到的主要问题是,当我使用多个播放器时,我会失真,并且在我的新录音中经常混合其他当前正在播放的声音(即使麦克风听不到它们)。是否与 libsndfilerecorder 和 FMOD 不兼容?

在这里我初始化播放器

for (int i=0; i<CHANNEL_COUNT; i++) {  
    lvelocity[i].set(1, 1, 1);  
    lup[i].set(0, 1, 0);  
    lforward[i].set(0, 0, 1);  
    lposition[i].set(0, 0, 0);  
    sposition[i].set(3, 3, 2);  
    svelocity[i].set(1, 1, 1);  
    //player[1].initializeFmod();  
    //player[i].loadSound( "1.wav" );  
    player[i].setVolume(0.75);  
    player[i].setMultiPlay(true);  
    player[i].play();  
    setupHold[i]==false;  
    recording[i]=false;  
    channelHasFile[i]=false;  
    settingOsc[i]=false;  
} 

当我录制时,我会卸载文件并确保未加载的播放器的位置没有更新。

无效 fmodApp::recordingStart(int recordingId){
if (recording[recordingId]==false) {  
    setupHold[recordingId]=true; //this stops the position updating  
    cout<<"Start recording Channel " + ofToString(recordingId+1)+"  setup hold is true \n";  
    pt=getDateName() +".wav";  
    player[recordingId].stop();  
    player[recordingId].unloadSound();  
    audioRecorder.setup(pt);  
    audioRecorder.setFormat(SF_FORMAT_WAV | SF_FORMAT_PCM_16);  
    recording[recordingId]=true; //this starts the libSndFIleRecorder  

}  
else {  
    cout<<"Channel" + ofToString(recordingId+1)+" is already recording \n";  
}  

}

我就这样停止录音。
void fmodApp::recordingEnd( int recordingId ){  
if (recording[recordingId]=true) {  
    recording[recordingId]=false;  
    cout<<"Stop recording" + ofToString(recordingId+1)+" \n";  
    audioRecorder.finalize();  
    audioRecorder.close();  
    player[recordingId].loadSound(pt);  
    setupHold[recordingId]=false;  
    channelHasFile[recordingId]=true;  
    cout<< "File recorded channel " + ofToString(recordingId+1) + " file is called " + pt + "\n";  
}  
else {  
    cout << "Sorry track" + ofToString(recordingId+1) + "is not recording";  
}  

}

我小心不要中断更新过程,但我看不出哪里出错了。

非常感谢

最佳答案

为了处理失真,我认为您需要在播放时降低每个 channel 的音量,尝试将音量设置为最大音量的 1/8。没有任何削波,所以如果声音的总和 > 1.0f 你会削波并且听起来很糟糕。

处理录音时的串扰:我猜你有一些输出反馈,即输出声音被反馈到输入 channel ,可能是由操作系统。如果您运行另一个发出声音的应用程序,您是否也会在录音中得到它?如果是这样,那可能是你的问题。

如果它适用于一个 channel ,请尝试仅使用 2 个,而不是直接跳到 8 个 channel 。

一般来说,我会尝试将播放/录制逻辑和 soundPlayer/recorder 抽象到一个单独的类中。你有几个 bool 值,使用 >1 bool 值很容易出错。有什么方法可以用枚举或整数状态变量替换 bool 值?

关于audio - FMOD 环绕声开放框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10984145/

相关文章:

c++ - 传递给另一个对象后如何访问自定义类型?

c - 将 URL 传递给从 WAV 文件中提取样本的特定示例代码

android - Opus Codec Android 转换码流

java - 根据音高、速度和速率应用声音效果

audio - ffmpeg - 在 LFE channel 上输出无低通的 5.1 AAC

c# - FMOD 无缝循环和序列播放

algorithm - 单应性算法未按预期工作

c++ - opencv 立体校准 -> 将相机图像 A 变形为相机图像 B

c++ - 我该如何解决这个错误?(在 QT Creator 中使用 FMOD)

c++ - 将分贝范围转换为字节范围