2010-08-03 5 views
4

Comment obtenir durée totale de la musique dans audioQueue. J'utiliseComment faire pour connaître l'heure et la durée en AudioQueue

NSTimeInterval AQPlayer::getCurrentTime() 
{ 
    NSTimeInterval timeInterval = 0.0; 

    AudioQueueTimelineRef timeLine; 
    OSStatus status = AudioQueueCreateTimeline(mQueue, &timeLine); 
    if(status == noErr) 
    { 
     AudioTimeStamp timeStamp; 
     AudioQueueGetCurrentTime(mQueue, timeLine, &timeStamp, NULL); 
     timeInterval = timeStamp.mSampleTime; 
    } 

    return timeInterval; 
} 

AudioQueueGetCurrentTime (mqueue, TimeLine, & timeStamp, NULL); pour obtenir le temps de lecture actuel, il donne une grande valeur est-il valide et comment obtenir la durée du fichier de musique.

Répondre

7

Pour référence ultérieure, je reçois un bon moment en quelques secondes en utilisant une légère modification du code de Chandan:

int AQPlayer::GetCurrentTime() { 
    int timeInterval = 0; 
    AudioQueueTimelineRef timeLine; 
    OSStatus status = AudioQueueCreateTimeline(mQueue, &timeLine); 
    if(status == noErr) { 
     AudioTimeStamp timeStamp; 
     AudioQueueGetCurrentTime(mQueue, timeLine, &timeStamp, NULL); 
     timeInterval = timeStamp.mSampleTime/mDataFormat.mSampleRate; // modified 
    } 
    return timeInterval; 
} 
+0

Cette méthode a été ajoutée à AQPlayer (v2.4) dans l'exemple Apple SpeakHere. – ThomasRS

+0

hey thomas voici une question connexe .. pouvez-vous jeter un oeil? Http: //stackoverflow.com/questions/12668803/difference-between-audioqueue-time-and-audioqueue-device-time – abbood

2

AudioQueueGetCurrentTime (mQueue, timeLine, & timeStamp, NULL); pour obtenir le temps de lecture actuel, il donne une grande valeur est-il valide

Probablement, mais ce n'est pas ce que vous pensez. Ce n'est pas en quelques secondes the docs ne dit pas vraiment ce que est dans, mais googler autour, il semble être dans des cadres, pour une raison quelconque. (Par exemple, this technote inclut un extrait qui le traite comme des images.) Essayez de diviser par la fréquence d'échantillonnage et de diviser par la fréquence d'images (de la source), et de voir laquelle vous donne des nombres sensés.

comment obtenir la durée du fichier de musique.

Il n'y en a pas. Une file d'attente audio est juste cela: une file d'échantillons audio à lire ou à enregistrer. La seule longueur de la file d'attente est le nombre d'échantillons que vous pouvez mettre en file d'attente; la file d'attente ne connaît pas la longueur de tout ce qui pourrait y pénétrer, si ces sources ont même une longueur finie.

La file d'attente audio appelle une fonction que vous créez pour récupérer les échantillons audio. Partout où votre fonction obtient les échantillons de (par exemple, un AudioFile) est l'endroit où vous devez obtenir la longueur de. Si vous générez les échantillons vous-même (comme dans un générateur de sons ou de sons), la longueur, le cas échéant, dépend de vous.

+0

J'ai des fichiers audio comme sample.mp4 ... comment obtenir la durée de l'audio . –

+0

Comme je l'ai dit, vous aurez besoin d'obtenir la durée de la même API que vous obtenez les échantillons. –

1
NSTimeInterval AQPlayer::getTotalDuration() 
{ 
    UInt64 nPackets; 
    UInt32 propsize = sizeof(nPackets); 

    XThrowIfError (AudioFileGetProperty(mAudioFile, kAudioFilePropertyAudioDataPacketCount, &propsize, &nPackets), "kAudioFilePropertyAudioDataPacketCount"); 
    Float64 fileDuration = (nPackets * mDataFormat.mFramesPerPacket)/mDataFormat.mSampleRate; 

    return fileDuration; 
} 
+0

Cela ne donnera pas toujours des résultats exacts. Tous les codecs n'auront pas un nombre constant de trames par paquet, et certains formats, tels que AAC, ont ce que Apple appelle les trames "d'amorçage" et "restantes". Vous devez obtenir la table de paquets du fichier pour vraiment calculer une durée précise. – sbooth

+0

@sbooth [Voici] (http://stackoverflow.com/a/18693593/1971013) mon travail pour cela. –

Questions connexes