Android上的OpenSL以高于应有的速度播放
OpenSL on Android plays at a higher rate than it should
我设法创建了一个OpenSL上下文,以便它播放声音。
但我仍然有一个问题:我将播放器的samplesPerSec
设置为 44.100 Hz
但它实际上以 ~ 70.000 Hz
运行。如何解决这个问题?
好吧,我将向您展示我所做的事情(完整在源代码):
在PolyOpenSLInterface中.cpp我正在初始化OpenSL并开始将缓冲区排队到我的SLAndroidSimpleBufferQueueItf
。我按以下方式创建播放器:
SLDataLocator_AndroidSimpleBufferQueue lDataLocatorIn;
lDataLocatorIn.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
lDataLocatorIn.numBuffers = 1;
SLDataFormat_PCM lDataFormat;
lDataFormat.formatType = SL_DATAFORMAT_PCM;
lDataFormat.numChannels = POLY_NUM_CHANNELS;
lDataFormat.samplesPerSec = SL_SAMPLINGRATE_44_1; //sampling rate 44.100Hz
lDataFormat.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
lDataFormat.containerSize = SL_PCMSAMPLEFORMAT_FIXED_16;
if(POLY_NUM_CHANNELS > 1){
lDataFormat.channelMask = SL_SPEAKER_FRONT_RIGHT | SL_SPEAKER_FRONT_LEFT;
} else {
lDataFormat.channelMask = SL_SPEAKER_FRONT_CENTER;
}
lDataFormat.endianness = SL_BYTEORDER_LITTLEENDIAN;
SLDataSource lDataSource;
lDataSource.pLocator = &lDataLocatorIn;
lDataSource.pFormat = &lDataFormat;
SLDataLocator_OutputMix lDataLocatorOut;
lDataLocatorOut.locatorType = SL_DATALOCATOR_OUTPUTMIX;
lDataLocatorOut.outputMix = mOutputMixObj;
SLDataSink lDataSink;
lDataSink.pLocator = &lDataLocatorOut;
lDataSink.pFormat = NULL;
const SLuint32 lSoundPlayerIIDCount = 2;
const SLInterfaceID lSoundPlayerIIDs[] = { SL_IID_PLAY, SL_IID_ANDROIDSIMPLEBUFFERQUEUE };
const SLboolean lSoundPlayerReqs[] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE };
lRes = (*mEngine)->CreateAudioPlayer(mEngine, &mPlayerObj, &lDataSource, &lDataSink, lSoundPlayerIIDCount, lSoundPlayerIIDs, lSoundPlayerReqs);
lRes = (*mPlayerObj)->Realize(mPlayerObj, SL_BOOLEAN_FALSE);
我注册的回调如下所示(我获取已经使用的缓冲区并将下一个示例写入其中并再次将缓冲区排队):
void OpenSLAudioInterface::queueCallback(SLAndroidSimpleBufferQueueItf caller, void* pContext){
OpenSLAudioInterface *audioInterface = (OpenSLAudioInterface*) pContext;
if(audioInterface->buffer && audioInterface->getMixer()) {
int16_t *out = (int16_t*)audioInterface->buffer;
audioInterface->getMixer()->mixIntoBuffer(out, POLY_FRAMES_PER_BUFFER);
(*(audioInterface->mPlayerQueue))->Enqueue(audioInterface->mPlayerQueue, out, sizeof(int16_t)*POLY_FRAMES_PER_BUFFER*POLY_NUM_CHANNELS);
}
}
那么谁能解释一下,为什么声音播放得比应有的~2 times faster
,为什么我需要混合以填充缓冲区的样本超过 44.100Hz ~2
倍?
我是否需要使用循环缓冲区(我在这里使用的缓冲区是否仍被 OpenSL 使用?
提前感谢您的所有建议和帮助!
所以我解决了这个问题。
我实际上初始化了两次 OpenSL,因此也开始从一个源写入两个并发缓冲区队列 - 这导致一半的帧无法正确播放。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 为什么在读取文件大小时文件IO速度会发生变化
- SFML纹理像播放器
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 如何收听Windows当前正在播放的声音?
- GStreamer在开始任何播放之前进行搜索
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 如何使用libav编写.mov文件,如果文件未正确完成,则可以播放
- C++新手,想知道如何使用VS code 2019播放音频文件
- 查找标准::hash_map与标准::矢量的速度
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- MF SinkWriter mp4文件的播放持续时间是添加音频样本时的一半,图像的播放速度也是添加音频样本的两倍
- Android上的OpenSL以高于应有的速度播放
- 使用AVIStreamWrite创建的AVI的长度和播放速度不正确
- 管理MP3的播放速度和位置