我是OpenAL的新手。我设法获得一个包含OpenAL for iPhone的声音管理器代码,因此我可以加载声音并播放它们。
但我真的需要知道每个声音文件的秒数,因为我需要在声音完成后立即调用一个事件。
我注意到有一种方法可以在填充缓冲区时计算声音的长度(?)。有人可以帮我弄这个吗?提前谢谢。
答案 0 :(得分:4)
float result;
alGetSourcef(sourceID, AL_SEC_OFFSET, &result);
return result;
您可以使用此片段获取声音的当前播放时间。
答案 1 :(得分:2)
如果使用已知格式的原始PCM音频样本填充已知大小的缓冲区,则:
duration = numberOfSampleFrames / sampleRate;
其中,通常,采样帧的数量是单声道16位采样的number_of_bytes / 2,或者是立体声的number_of_bytes / 4等。
答案 2 :(得分:2)
我遇到了同样的问题并提出了以下解决方案。第一个功能是可选的,但允许补偿经过的时间。然后我用所产生的时间间隔发射NSTimer。
玩得开心!德克
static NSTimeInterval OPElapsedPlaybackTimeForSource(ALuint sourceID) {
float result = 0.0;
alGetSourcef(sourceID, AL_SEC_OFFSET, &result);
return result;
}
static NSTimeInterval OPDurationFromSourceId(ALuint sourceID) {
ALint bufferID, bufferSize, frequency, bitsPerSample, channels;
alGetSourcei(sourceID, AL_BUFFER, &bufferID);
alGetBufferi(bufferID, AL_SIZE, &bufferSize);
alGetBufferi(bufferID, AL_FREQUENCY, &frequency);
alGetBufferi(bufferID, AL_CHANNELS, &channels);
alGetBufferi(bufferID, AL_BITS, &bitsPerSample);
NSTimeInterval result = ((double)bufferSize)/(frequency*channels*(bitsPerSample/8));
NSLog(@"duration in seconds %lf", result);
return result;
}
答案 3 :(得分:0)
ALint bufferID, bufferSize;
alGetSourcei(sourceID, AL_BUFFER, &bufferID);
alGetBufferi(bufferID, AL_SIZE, &bufferSize);
NSLog(@"time in seconds %f", (1.0*bufferSize)/(44100*2*2)); //44100 * 2 chanel * 2byte (16bit)