gpt4 book ai didi

c - 录制的声音比原来的慢

转载 作者:太空宇宙 更新时间:2023-11-04 02:40:53 24 4
gpt4 key购买 nike

我正在尝试实现循环功能。基本上我将音乐样本保存在缓冲区中。然后当我按下循环进入按钮时,我及时设置初始循环,当按下循环结束时设置循环结束时间。为了获得循环部分,我制作了循环结束时间 - 及时循环,这给了我循环的秒数。然后我乘以秒数 * 采样率 (44100),分配一个具有该大小的新缓冲区并用声音数据填充它。一切正常,但当我通过 Open SL ES 收听循环缓冲区时,声音比原来的慢。我真的不知道为什么...

SLmillisecond loopInPosition, loopOutPosition;
float loopDuration;
const char *lastPath;
short *sampleBuffer, *loopBuffer;
int xSampleBufferSize, xLoopBuffersize;

void playBuffer();

// get the position in the music sample when loop in or out button is pressed
SLmillisecond getCurrentPosition(jint playerIndex, SLmillisecond* whereToSave) {

Player player = players[playerIndex];
if (player.isReady == 1) {
(*(player.playerPlayItf))->GetPosition(player.playerPlayItf,
whereToSave);

__android_log_print(ANDROID_LOG_DEBUG, "jajaja",
">>NATIVE position is: %d", *whereToSave);
}
}

void loopIn(JNIEnv* env,
jclass clazz, jint selectedSlot, jstring filename) {

lastPath = (*env)->GetStringUTFChars(env, filename, NULL);
assert(NULL != path);

getCurrentPosition(selectedSlot, &loopInPosition);
}

void loopOut(JNIEnv* env,
jclass clazz, jint selectedSlot) {

getCurrentPosition(selectedSlot, &loopOutPosition);

loopDuration = (float) ((float) (loopOutPosition - loopInPosition) / 1000);

__android_log_print(ANDROID_LOG_DEBUG, "jajaja",
">>NATIVE loop duration is: %f", loopDuration);

SF_INFO sndInfo;
SNDFILE *sndFile = sf_open(lastPath, SFM_READ, &sndInfo);

if (sndInfo.format != (SF_FORMAT_WAV | SF_FORMAT_PCM_16)) {
fprintf(stderr, "Input should be 16bit Wav\n");
sf_close(sndFile);
} else {

__android_log_print(ANDROID_LOG_DEBUG, "jajaja",
">>NATIVE File info samplerate %d, channels %d, format %d, sections %d, seekable %d",
sndInfo.samplerate, sndInfo.channels, sndInfo.format,
sndInfo.sections, sndInfo.seekable);
}

// Sample Buffer
int sampleBufferSize = sndInfo.frames * sizeof(short);
xSampleBufferSize = sampleBufferSize;
sampleBuffer = malloc(sampleBufferSize);


__android_log_print(ANDROID_LOG_DEBUG, "jajaja",
">>NATIVE allocated sample buffer: size %d, frames %d",
sampleBufferSize, sndInfo.frames);

sf_readf_short(sndFile, sampleBuffer, sndInfo.frames);

// Loop Buffer
int loopBufferSize = loopDuration * 44100 * sizeof(short);
int loopBufferFrames = loopDuration * 44100;
xLoopBuffersize = loopBufferSize;
loopBuffer = malloc(loopBufferSize);

__android_log_print(ANDROID_LOG_DEBUG, "jajaja",
">>NATIVE allocated loop buffer: size %d, frames %d",
loopBufferSize, loopBufferFrames);

int index, i = 0;
int startIndex = (int) ((float) (loopInPosition / 1000) * 44100);

__android_log_print(ANDROID_LOG_DEBUG, "jajaja",
">>NATIVE start index is %d", startIndex);

for (index = startIndex, i = 0; index < startIndex + loopBufferFrames;
++index, ++i) {

loopBuffer[i] = sampleBuffer[index];
}
}

谢谢你的时间

最佳答案

似乎正在发生的事情是您正在处理交错的立体数据。这意味着两个 channel 都存储为一个连续的 block :第一个 channel 的样本,第二个 channel 的样本,第一个 channel 的样本,依此类推。

但是,您的缓冲区以单声道方式播放,因此当它被播放时,它会认为用于第二个 channel 的每个样本都用于第一个(也是唯一一个) channel 。这会创建重复样本,使其听起来更慢。

当您执行 loopBuffer[i] = sampleBuffer[index * 2] 时,您实际上跳过了用于第一个 channel 的每个样本,仅复制用于第一个 channel 的样本第二个 channel 。

您可能希望配置您的音频播放器以将您的缓冲区解释为交错的立体声数据。

关于c - 录制的声音比原来的慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31987501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com