2010-10-13 9 views
2

Je suis Tring pour comprendre les choses * Audio pour iPhonecomment calculer le nombre de paquets pour X secondes?

actuellement je lis: core audio overview

ici, j'ai une question:

de codes par exemple de pomme:

- (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]; 
} 

j'ai compris presque tout, mais je n'ai tout simplement pas obtenu pourquoi:
Float64 numPacketsForTime = audioFormat.mSampleRate/audioFormat.mFramesPerPacket * seconds;

je pensais que quelque chose comme ça fonctionnerait: numPacketsForTime = seconds * packetsPerSecond

donc, packetsPerSecond = audioFormat.mSampleRate/audioFormat.mFramesPerPacket ????

pourriez-vous m'aider avec les maths?

merci!

Répondre

3

formule d'Apple est:

audioFormat.mSampleRate/audioFormat.mFramesPerPacket * seconds; 

combinant vos formules donne:

seconds * audioFormat.mSampleRate/audioFormat.mFramesPerPacket 

qui est exactement la même formule avec l'ordre a changé. Notez que:

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

Vous semblez le comprendre mais de différentes directions. 8)

+0

Oui, je comprends que A * B/C == B/C * A. Ce que je ne comprends pas, c'est pourquoi ce 'audioFormat.mSampleRate/audioFormat.mFramesPerPacket' ?, le mpsampleRate me donnera le nombre de 'samples' pour chaque seconde. l'audioFormat.mFramesPerPacket me donnera le nombre de cadres par paquet ?, Quelle est la relation avec les paquetsPerSecond ?? – jhon

+0

Essayez de regarder les unités. SampleRate serait des images/secondes. FramesPerPacket serait des cadres/paquets. SampleRate/FramesPerPacket serait (images/secondes)/(images/paquets). L'annulation des trames et le réarrangement donne des paquets/secondes ou PacketsPerSecond. –

Questions connexes