Quel est le moyen le plus simple d'obtenir une durée d'un fichier audio? p>
Je pourrais créer un objet d'Avaudioplayer, l'initialiser avec URL et que de faire la durée, mais de cette façon est trop longue. Y a-t-il un moyen plus facile? P>
Merci. P>
8 Réponses :
Si vous savez quelque chose sur le fichier audio en question (samplate, bitdepth, nombre de canaux), et c'est un format non compressé (WAV / AIFF), vous pouvez alors calculer / approximatiser / durée à partir du fichierizeize: P>
longueur_in_seconds = (fichier_longueur-deviness_100_bytes_for_header) / (Samplate * (BitDepth * Channel_Count / 8)) P>
100 octets pour l'en-tête? Tout ce qui est arrivé au Canonical 44? :)
Je devrais savoir mieux après 14 ans, mais le mois dernier, j'ai passé une demi-journée à essayer de déterminer où le petit clic au début de mon son provenait. J'utilisais ma méthode rapide et sale qui supposait que l'en-tête 44 octets. J'ai appris ma leçon, encore une fois.
Vous pouvez prendre des donnéesOffset que je suppose indique la taille de l'en-tête. sint64 dataOpsSetSet = 0; Uint32 dataoffsetsize = Tailleof (DataOffset); AudiofileStreamgeMProperty (inaudiofileStream, kaudiofiletreamProperty_dataoffset, & dataOpsSetSize, & dataOpsset); code>
Cela dépend du type de fichier. Si c'est un fichier WAV, vous pouvez localiser l'en-tête du fichier et déterminer la durée de lecture de cette façon. Si c'est un format compressé (* .mp3, etc.), vous ferez mieux de rester à la méthode que vous avez mentionnée. P>
Vous pouvez utiliser les fonctions de services de fichiers audio. Il y a une propriété pour obtenir cela devrait vous donner la durée estimée. Code: Vous pouvez vérifier les docs ici p> p>
Merci, mais je ne comprends pas, pourquoi est-ce que je reçois chaque fois que le repose-tête est-il égal à 0?
Merci pour votre solution, j'ai découvert où se trouvait le problème.
Hé, ce n'est pas du tout juste, en utilisant les connaissances réelles pour obtenir le chèque, au lieu de vague spéculation sur un système d'exploitation que vous n'avez jamais travaillé. :)
@Ilya: content que ça a fonctionné! @Musigenesis: Je dois utiliser des connaissances réelles sur une réponse!
gotcha ... Le type de données doit être float64 pas uiint64!
CORRECT CODE est
NSURL *afUrl = [NSURL fileURLWithPath:soundPath]; AudioFileID fileID; OSStatus result = AudioFileOpenURL((CFURLRef)afUrl, kAudioFileReadPermission, 0, &fileID); Float64 outDataSize = 0; UInt32 thePropSize = sizeof(Float64); result = AudioFileGetProperty(fileID, kAudioFilePropertyEstimatedDuration, &thePropSize, &outDataSize); AudioFileClose(fileID);
J'ai codé l'objectif-C pendant une journée maintenant alors excusez la question novice. Comment puis-je obtenir le repose-tête dans un int qui contient des millisecondes.
Si quelqu'un atterrit ici à la recherche d'un moyen d'obtenir la durée des fichiers audio et vidéo, consultez cette réponse à un autre message, qui utilise plutôt https://stackoverflow.com/a/7052147/381233 p>
Utilisation de (assez intéressant, cependant, la durée des deux solutions était parfois de 1 seconde de plus que celle affichée dans l'interface utilisateur d'un avastet code> à la place: p>
AudiofilegetProperty code> (comme les deux autres réponses principales ici) pour obtenir la durée des fichiers A / V n'a pas fonctionné pour quelques fichiers .mov em> sur mon appareil (résultat était toujours 0), tandis que la solution utilisant
avastet code> a obtenu la durée de tous les fichiers audio et vidéo sur mon appareil. P>
Avaudioplayer code>. Très probablement, l'avaudioplayer Code> utilise un Routine d'arrondi non standard pour la durée affichée.) P>
échantillon code de réponse Comment obtenir La durée d'un fichier audio dans iOS? . C'est la meilleure réponse.
AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:audioFileURL options:nil]; CMTime audioDuration = audioAsset.duration; float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
Combinant Avadiaplouche avec Swift devient aussi facile que (je migre un tableau de royaume ci-dessous, mais vous obtenez l'idée):
import AVFoundation let resource = old!["filename"] as? String let afUrl = NSBundle.mainBundle().URLForResource(resource, withExtension: nil) let player = try! AVAudioPlayer(contentsOfURL: afUrl!) new!["duration"] = Double(player.duration)
AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:mp3_url options:nil]; [audioAsset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler:^{ CMTime audioDuration = audioAsset.duration; float audioDurationSeconds = CMTimeGetSeconds(audioDuration); NSLog(@"duration:%f",audioDurationSeconds); }];
Duplicaillier possible de Comment obtenir la durée d'un Fichier audio dans iOS?