iPhone / OpenAL获取样本的声音长度(播放时间)

时间:2011-02-27 19:59:06

标签: iphone openal

我是OpenAL的新手。我设法获得一个包含OpenAL for iPhone的声音管理器代码,因此我可以加载声音并播放它们。

但我真的需要知道每个声音文件的秒数,因为我需要在声音完成后立即调用一个事件。

我注意到有一种方法可以在填充缓冲区时计算声音的长度(?)。有人可以帮我弄这个吗?提前谢谢。

4 个答案:

答案 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)