Как рассчитать количество пакетов за X секунд? - PullRequest
2 голосов
/ 13 октября 2010

я пытаюсь понять аудио * вещи для iPhone

В настоящее время я читаю: Обзор аудио ядра

вот у меня вопрос:

из примеров кода Apple:

- (void) calculateSizesFor: (Float64) seconds {

    UInt32 maxPacketSize;
    UInt32 propertySize = sizeof (maxPacketSize);

    AudioFileGetProperty (
        audioFileID,
        kAudioFilePropertyPacketSizeUpperBound,
        &propertySize,
        &maxPacketSize
    );

    static const int maxBufferSize = 0x10000;   // limit maximum size to 64K
    static const int minBufferSize = 0x4000;    // limit minimum size to 16K

    if (audioFormat.mFramesPerPacket) {
        Float64 numPacketsForTime =
            audioFormat.mSampleRate / audioFormat.mFramesPerPacket * seconds;
        [self setBufferByteSize: numPacketsForTime * maxPacketSize];
    } else {
        // if frames per packet is zero, then the codec doesn't know the
        // relationship between packets and time. Return a default buffer size
        [self setBufferByteSize:
            maxBufferSize > maxPacketSize ? maxBufferSize : maxPacketSize];
    }

    // clamp buffer size to our specified range
    if (bufferByteSize > maxBufferSize && bufferByteSize > maxPacketSize) {
        [self setBufferByteSize: maxBufferSize];
    } else {
        if (bufferByteSize < minBufferSize) {
            [self setBufferByteSize: minBufferSize];
        }
    }

    [self setNumPacketsToRead: self.bufferByteSize / maxPacketSize];
}

Я понял почти все, но я просто не понял, ПОЧЕМУ это:
Float64 numPacketsForTime = audioFormat.mSampleRate / audioFormat.mFramesPerPacket * seconds;

Я думал, что-то вроде этого будет работать: numPacketsForTime = seconds * packetsPerSecond

итак, packetsPerSecond = audioFormat.mSampleRate / audioFormat.mFramesPerPacket ????

не могли бы вы помочь мне с математикой?

спасибо!

1 Ответ

3 голосов
/ 13 октября 2010

Формула Apple:

audioFormat.mSampleRate / audioFormat.mFramesPerPacket * seconds;

, объединяющая ваши формулы, дает:

seconds * audioFormat.mSampleRate / audioFormat.mFramesPerPacket

, что в точности соответствует формуле с измененным порядком.Обратите внимание:

seconds * audioFormat.mSampleRate / audioFormat.mFramesPerPacket
= seconds * (audioFormat.mSampleRate / audioFormat.mFramesPerPacket)
= (audioFormat.mSampleRate / audioFormat.mFramesPerPacket) * seconds
= audioFormat.mSampleRate / audioFormat.mFramesPerPacket * seconds

Вы, кажется, понимаете это, но с разных сторон.8)

...