Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone/OpenAL获取样本的声音长度(播放时间)_Iphone_Openal - Fatal编程技术网

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

iPhone/OpenAL获取样本的声音长度(播放时间),iphone,openal,Iphone,Openal,我是OpenAL的新手。我设法得到了一个soundmanager代码,它包装了iPhone的OpenAL,这样我就可以加载声音并播放它们了 但我真的需要知道每个声音文件的秒长,因为我需要在声音完成后立即调用事件 我注意到在填充缓冲区(?)时有一种计算声音长度的方法。有人能帮我吗?提前感谢。如果您正在使用已知格式的原始PCM音频样本填充已知大小的缓冲区,则: duration = numberOfSampleFrames / sampleRate; 其中,典型情况下,对于单声道16位采样,采

我是OpenAL的新手。我设法得到了一个soundmanager代码,它包装了iPhone的OpenAL,这样我就可以加载声音并播放它们了

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


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

如果您正在使用已知格式的原始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;
}