android - 如何在音频过程中使用超强时间拉伸课程
问题描述
我在使用超强时间拉伸来改变我的音频速率时遇到问题。我知道由于输出帧数,我需要处理时间拉伸率乘以帧数。
例如:如果我将时间拉伸率设置为 1.5(增加原始速度的 50%)并且帧数为 144,那么我需要的帧数为 1.5 144=216。当我将时间拉伸率设置为 1.3(增加原始速度的 30%)时,就会出现问题:1.5 144=187.2 - 一个小数。
我的音频处理方法如下:
bool MultiTracksPlayer::process(
short int *output,
unsigned int numberOfFrames,
unsigned int samplerate
) {
int i = 0;
for (i = 0; i < tracksAmount; i++) {
tracks[i]->outputSamplerate = samplerate;
tracks[i]->syncMode = Superpowered::SyncMode_TempoAndBeat;
}
auto numberOfInputFramesNeeded = (int) (timeStretching->rate * (float) numberOfFrames);
float buffer[3][numberOfInputFramesNeeded * 8 + 64];
bool silence[3];
silence[0] = silence[1] = silence[2] = true;
for (i = tracksAmount - 1; i >= 0; i--) {
if (tracks[i]->leftVolume > 0) {
if (tracks[i]->rightVolume > 0) {
if (tracks[i]->processStereo(buffer[2], !silence[2], numberOfInputFramesNeeded))
silence[2] = false;
} else if (tracks[i]->processStereo(buffer[0], !silence[0], numberOfInputFramesNeeded))
silence[0] = false;
} else if (tracks[i]->processStereo(buffer[1], !silence[1], numberOfInputFramesNeeded, true))
silence[1] = false;
}
audioMixer.process(
silence[0] ? nullptr : buffer[0],
silence[1] ? nullptr : buffer[1],
silence[2] ? nullptr : buffer[2],
nullptr,
buffer[0],
numberOfInputFramesNeeded
);
silence[0] &= silence[1] && silence[2];
timeStretching->addInput(buffer[0], (int) numberOfInputFramesNeeded);
timeStretching->getOutput(buffer[0], (int) numberOfFrames);
if (!silence[0])
Superpowered::FloatToShortInt(buffer[0], output, numberOfFrames);
return !silence[0];
}
解决方案
我将时间拉伸的方法更改为高级音频播放器播放速率属性。
推荐阅读
- c# - 在 C# 中计算数字总和时遇到问题
- php - Laravel Blade 底部扩展内容
- reactjs - 为什么asp.net core 3.0 reactjs app只在刷新浏览器后才出现?
- java - 创建 EntityManagerFactory 时出错:java.lang.NoClassDefFoundError
- opentbs - 生成的 Excel 文件在打开时没有调整行高
- python - 如何在单独的文件中写入数组?
- python - 来自点列表(不同长度)而不是图像的 findHomography 匹配器
- ios - Firebase 身份验证不插入新值
- android - 如何有效地在 android 应用程序中实现 firebase 分析?
- c# - 为什么在实例化预制件以复制它时,它会复制数量的两倍,而一些位置和旋转错误?