- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试以编程方式创建到扬声器或输出的零延迟麦克风环回。这用于为耳机生成侧音。我相信任何读者都知道,侧音必须是零延迟,否则,延迟听到自己的声音会导致您失去大部分连贯的说话能力。
我尝试使用 C# 中的 Naudio 和 C++ 中的 portaudio 创建解决方案。我在 PortAudio 上运气最好,但是我无法实现我需要的零延迟侧音。 Portaudio 产生了 5 毫秒左右的延迟,这是可以检测到的,并导致我的讲话不断放慢速度。
我确实知道 Windows 提供了麦克风环回,我已经对此进行了测试,但即使是 Windows 环回也有足够的延迟作为侧音令人讨厌。
我的问题分为两部分
1.) 这是硬件/软件的局限性吗?实现零音频延迟实际上是无法克服的吗?
2.) 这是我使用 portaudio 的 C++ 代码。有什么方法可以比我现有的更能减少延迟吗? (请原谅我可能草率的代码,我是 C++ 的新手而且我还在学习)
class vC_sidetone {
public:
void enable(int in_ch, int out_ch);
void disable();
vC_sidetone(int inputDevice, int outputDevice){
st_inputDevice = inputDevice;
st_outputDevice = outputDevice;
}
int st_instanceCallBack(const void *inputBuffer,
void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo *timeInfo,
PaStreamCallbackFlags statusFlags);
private:
int st_inputDevice;
int st_outputDevice;
PaError st_error;
PaStream *st_stream = NULL;
};
PaStreamParameters vC_getParam(PaDeviceIndex dev, int ch, PaSampleFormat smplFormat){
PaStreamParameters param;
param.device = dev;
param.channelCount = ch;
param.sampleFormat = smplFormat;
//param.suggestedLatency = Pa_GetDeviceInfo(dev)->defaultLowInputLatency;
param.suggestedLatency = 0.000; //here is a good place to tweak latency
param.hostApiSpecificStreamInfo = NULL;
return param;
}
void vC_sidetone::enable(int in_ch, int out_ch){
int framesPerBuffer = 1;
PaSampleFormat smplFormat = paFloat32;
int smplRate = 44100;
PaStreamParameters inParam = vC_getParam(st_inputDevice, in_ch, smplFormat);
PaStreamParameters outParam = vC_getParam(st_outputDevice, out_ch, smplFormat);
st_error = Pa_Initialize();
// Open and start stream using callback:
st_error = Pa_OpenStream(
&st_stream,
&inParam,
&outParam,
smplRate,
framesPerBuffer,
paClipOff,
st_gblCallBack,
this
);
st_error = Pa_StartStream(st_stream);
}
void vC_sidetone::disable(){
st_error = Pa_StopStream(st_stream);
Pa_AbortStream(st_stream);
Pa_CloseStream(st_stream);
Pa_Terminate();
}
int vC_sidetone::st_instanceCallBack(const void *inputBuffer,
void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo *timeInfo,
PaStreamCallbackFlags statusFlags){
(void)timeInfo; // Prevent unused variable warnings.
(void)statusFlags;
// Cast data to floats:
float *out = (float*)outputBuffer;
float *in = (float*)inputBuffer;
unsigned long i;
//for (i = 0; i < framesPerBuffer*NUM_CHANNELS; i++)
// out[i] = in[i];
for (i = 0; i < framesPerBuffer; i++) //another good place for latency
out[i] = in[i];
return paContinue;
}
//this is actually not part of the vC_sidetone class, I was getting linker errors
static int st_gblCallBack(const void *inputBuffer,
void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo *timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData){
return ((vC_sidetone*)userData)->st_instanceCallBack(inputBuffer, outputBuffer,
framesPerBuffer,
timeInfo,
statusFlags);
}
最佳答案
抽象层只能增加延迟,而不能减少延迟。很明显,时间旅行是不可能的。 PulseAudio 不是 Windows 上的原生 API,它建立在原生音频架构之上。
当前的原生 Windows API 是 WASAPI。它以低延迟而享有盛誉。但它也是底层硬件之上的抽象层。例如 USB 也有延迟。没有比这更好的了。
关于c++ - 零延迟麦克风环回、侧音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31011619/
我是 Arduino 的新手(因为这个周末我必须学习它来完成一个学校项目)并且我无法让我的压电扬声器为闹钟发出声音。当草图运行时,一切正常。 LED 闪烁,但蜂鸣器不发声,这很奇怪,因为 LED 和蜂
我想知道是否有人遇到过在 iPhone SDK 中生成铃声的方法。我正在尝试生成 DTMF 音调,但似乎找不到任何实质性内容。我还希望能够指定播放音调的时间(即模拟按住按钮而不是简单地按下按钮....
我正在尝试制作一个可以在 Octave 音阶中水平滚动的钢琴应用程序。下面是另一个我尝试做的钢琴应用程序的示例。箭头在钢琴上滚动 Octave 。我已经了解了scrollview,但是似乎只允许通过滑
我正在我的 Android 应用程序中使用文本转语音 - TTS。我已经粘贴了下面的代码。TTS 工作正常,但是它说的语音/文本不是很清楚。它说的真的快速,以至于它不是完全可以理解的.. 我尝试设置
我正在调用一个带有号码的通话应用程序,然后通过 发送 dtmf 音 String number = "tel:+1234567,890#"; Intent c1 = new Intent(androi
我正在开展一个项目,该项目要求我的应用能够在通话期间以语音的上行链路频率发送 DTMF 音。 我的两个条件是: 我们不使用定制的 Android 平台 我们不需要root手机 我花了几天时间做功课,并
我需要制作一个IVR -auto dialer应用程序,它 => 调用免费电话 => 然后选择一个选项继续 => 然后输入一些代码 => 然后几秒钟后(一些广告/说 30 秒)需要输入另一个选项 前三
在我的 Twilio基于应用程序我通过 Twilio REST 创建拨出电话API。 当目标方响应时,我将他/她放到最近创建的 session 中。 在让他/她参加 session 之前,如何播放特定
Twilio 未从 Skype 检测到我的 DTMF 音。 我们用 twilio 建立了一个 IVR 系统,客户必须输入一个 7位客户编号。 我们的一些客户使用 voip 电话, 因此我们需要确保 t
我想在我的应用程序中以编程方式发送DTMF 铃声。在搜索时我找到了一个方法 public void playDtmfTone(字符数字) 这是 google 在 android 中发送 DTMF 的新
我读过一些有关 Android 中 DTMF 的文章。我想不可能通过流式传输 .wav 文件(或其他格式)进行自动电话调用并检测其他人(调用接收者)的输入。 我想制作一个应用程序来调用我/或其他人,并
我是一名优秀的程序员,十分优秀!