【发布时间】:2020-03-30 16:37:27
【问题描述】:
我正在使用 Oboe C++ 库在我的 Android 应用程序中播放声音。 我想改变我的音频样本的音高。 因此,我开始创建“mPos”浮点值来保存当前播放的帧,并在每一步添加“mPitch”值。
似乎使用新的音高可以正确播放音频,但是当音高高(例如 1.2)并发出奇怪的噪音以及音高低(例如 0.212)时,它是自身的两倍。
这是我第一次做音频节目, 在发布这个问题之前,我做了很多研究。我什至直接向“双簧管”支持发送消息但没有响应。 有谁知道如何正确实施 Pitch?
streamLength 总是 192
channelCount 总是 2
代码:
void Player::renderAudio(float *stream, int32_t streamLength){
const int32_t channelCount = mSound->getChannelCount();
if (mIsPlaying){
float framesToRenderFromData = streamLength ;
float totalSourceFrames = mSound->getTotalFrames()/mPitch;
const float *data = mSound->getData();
// Check whether we're about to reach the end of the recording
if (mPos + streamLength >= totalSourceFrames ){
framesToRenderFromData = (totalSourceFrames - mPos);
mIsPlaying = false;
}
for (int i = 0; i < framesToRenderFromData; ++i) {
for (int j = 0; j < channelCount; ++j) {
if(j % 2 == 0){
stream[(i*channelCount)+j] = (data[((size_t)mPos * channelCount)) + j] * mLeftVol) * mVol;
}else{
stream[(i*channelCount)+j] = (data[((size_t)mPos * channelCount)) + j] * mRightVol) * mVol;
}
}
mPos += mPitch;
if(mPos >= totalSourceFrames){
mPos = 0;
}
}
if (framesToRenderFromData < streamLength){
renderSilence(&stream[(size_t)framesToRenderFromData], streamLength * channelCount);
}
} else {
renderSilence(stream, streamLength * channelCount);
}
}
void Player::renderSilence(float *start, int32_t numSamples){
for (int i = 0; i < numSamples; ++i) {
start[i] = 0;
}
}
void Player::setPitch(float pitchData){
mPitch = pitchData;
};
【问题讨论】: