iPhone/OpenAL获取样本的声音长度(播放时间)
我是OpenAL的新手。我设法得到了一个soundmanager代码,它包装了iPhone的OpenAL,这样我就可以加载声音并播放它们了 但我真的需要知道每个声音文件的秒长,因为我需要在声音完成后立即调用事件iPhone/OpenAL获取样本的声音长度(播放时间),iphone,openal,Iphone,Openal,我是OpenAL的新手。我设法得到了一个soundmanager代码,它包装了iPhone的OpenAL,这样我就可以加载声音并播放它们了 但我真的需要知道每个声音文件的秒长,因为我需要在声音完成后立即调用事件 我注意到在填充缓冲区(?)时有一种计算声音长度的方法。有人能帮我吗?提前感谢。如果您正在使用已知格式的原始PCM音频样本填充已知大小的缓冲区,则: duration = numberOfSampleFrames / sampleRate; 其中,典型情况下,对于单声道16位采样,采
我注意到在填充缓冲区(?)时有一种计算声音长度的方法。有人能帮我吗?提前感谢。如果您正在使用已知格式的原始PCM音频样本填充已知大小的缓冲区,则:
duration = numberOfSampleFrames / sampleRate;
其中,典型情况下,对于单声道16位采样,采样帧的数量是字节数/2,对于立体声,采样帧的数量是字节数/4,等等
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)
您可以使用此片段获取声音的当前播放时间。我也有同样的问题,并提出了以下解决方案。第一个功能是可选的,但允许补偿经过的时间。然后我将使用生成的时间间隔触发一个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;
}
这是正确的,在OpenAL的情况下,您将只处理PCM音频、立体声或单声道、16位或8位(尽管8位似乎在iOS上不起作用)。我的问题似乎是,如果不学习OpenAL,我甚至不知道如何获得缓冲区或采样器的大小。我还没有时间研究这件事,真让我难受。不管怎样,我都要调查一下,想办法弄清楚。谢谢你的评论。卡尔,这不完全是真的。对于vanilla-OpenAL也是如此,但通过扩展,它也可以是其他格式(例如32位浮点)。
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;
}