iPhone / OpenAL получает длину звука (время воспроизведения) семпла - PullRequest
2 голосов
/ 27 февраля 2011

Я новичок в OpenAL.Мне удалось получить код звукового менеджера, который упаковывает OpenAL для iPhone, поэтому я могу загружать звуки и воспроизводить их.

Но мне действительно нужно знать, как долго каждый звуковой файл длится в секундах, потому что мне нужно вызвать событие каккак только звук закончится.

Я заметил, что есть способ вычислить длину звука при заполнении буферов (?).Может кто-то помочь мне с этим?Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 03 января 2012
float result;
alGetSourcef(sourceID, AL_SEC_OFFSET, &result);
return result;

Вы можете использовать этот фрагмент для получения текущего времени воспроизведения звука.

2 голосов
/ 11 января 2012

У меня та же проблема, и я нашел следующее решение.Первая функция является необязательной, но позволяет компенсировать прошедшее время.Затем я запускаю 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;
}
2 голосов
/ 28 февраля 2011

Если вы заполняете буферы известного размера необработанными аудиосэмплами PCM известного формата, то:

duration = numberOfSampleFrames / sampleRate;  

, где, как правило, число кадров сэмплов равно number_of_bytes / 2 для моно 16-битных сэмплов или number_of_bytes / 4 для стерео и т. Д.

0 голосов
/ 19 декабря 2011
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...