9
votes

iPhone: obtenir la durée d'un fichier audio

Quel est le moyen le plus simple d'obtenir une durée d'un fichier audio?

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?

Merci.


1 commentaires

8 Réponses :


2
votes

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:

longueur_in_seconds = (fichier_longueur-deviness_100_bytes_for_header) / (Samplate * (BitDepth * Channel_Count / 8))


3 commentaires

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);



2
votes

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.


0 commentaires

10
votes

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: xxx

Vous pouvez vérifier les docs ici


5 commentaires

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!



15
votes

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);


1 commentaires

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.



1
votes

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 avastet à la place:

https://stackoverflow.com/a/7052147/381233

Utilisation de AudiofilegetProperty (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 sur mon appareil (résultat était toujours 0), tandis que la solution utilisant avastet a obtenu la durée de tous les fichiers audio et vidéo sur mon appareil.

(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 Avaudioplayer . Très probablement, l'avaudioplayer utilise un Routine d'arrondi non standard pour la durée affichée.)


0 commentaires

1
votes

é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);


0 commentaires

2
votes

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)


0 commentaires

1
votes
 AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:mp3_url options:nil];
                    [audioAsset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler:^{
                        CMTime audioDuration = audioAsset.duration;
                        float audioDurationSeconds = CMTimeGetSeconds(audioDuration);

                        NSLog(@"duration:%f",audioDurationSeconds);
                    }];

0 commentaires