Jak uzyskać czas trwania pliku audio w systemie iOS?

NSDictionary* fileAttributes = 
    [[NSFileManager defaultManager] attributesOfItemAtPath:filename 
                                                     error:nil]

Z kluczy atrybutów pliku można uzyskać datę, rozmiar itp. Ale jak uzyskać czas trwania?

Author: Chris Markle, 2011-03-07

4 answers

W 'file Attribute Keys' nsfilemanager class reference możesz zobaczyć, że nie ma klucza, który zwróci czas trwania utworu. Wszystkie informacje, które instancja NSFileManager otrzymuje o pliku, dotyczą właściwości samego pliku w systemie operacyjnym, takich jak jego rozmiar. NSFileManager nie interpretuje pliku.

Aby uzyskać czas trwania pliku, musisz użyć klasa, która wie jak zinterpretować plik. Framework AVFoundation zapewnia dokładnie taką klasę, jakiej potrzebujesz, AVAsset . Możesz utworzyć instancję tej abstrakcyjnej klasy, używając konkretnej podklasy AVURLAsset , a następnie podać jej NSURL , która wskazuje na plik audio, który chcesz uzyskać czas trwania. Następnie można uzyskać czas trwania z instancji AVAsset , pytając o jej właściwość duration.

Na przykład:

AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:audioFileURL options:nil];
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);

Zauważ, że AVFoundation został zaprojektowany jako mocno asynchroniczny framework w celu poprawy wydajności i ogólnego doświadczenia użytkownika. Nawet wykonywanie prostych zadań, takich jak odpytywanie o czas trwania pliku multimedialnego, może potencjalnie zająć dużo czasu i może spowodować zawieszenie aplikacji. Należy użyć protokołu AVAsynchronousKeyValueLoading , aby asynchronicznie załadować czas trwania utworu, a następnie zaktualizować interfejs użytkownika w bloku obsługi zakończenia. Powinieneś spojrzeć na 'blok Programming Guide " oraz film WWDC2010 zatytułowany "Discovery AV Foundation", który jest dostępny za darmo pod adresem https://developer.apple.com/videos/wwdc/2010 .

 122
Author: James Bedford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-14 17:59:29

Dla kompletności-jest inny sposób, aby uzyskać czas trwania pliku mp3:

NSURL * pathToMp3File = ...
NSError *error = nil;
AVAudioPlayer* avAudioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:pathToMp3File error:&error];

double duration = avAudioPlayer.duration; 
avAudioPlayer = nil;

Użyłem tego bez zauważalnego opóźnienia.

 13
Author: John Goodstadt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-10 05:08:21

Możesz osiągnąć to samo w Swift używając :

let audioAsset = AVURLAsset.init(url: audioFileURL, options: nil)
let duration = audioAsset.duration
let durationInSeconds = CMTimeGetSeconds(duration)
 5
Author: Ashildr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-24 05:36:14

Dla każdego, kto wciąż tego szuka. Na podstawie odpowiedzi, kod Swift 4 (w tym asynchroniczne Ładowanie wartości zaczerpniętych z Dokumentacji Apple):

let audioAsset = AVURLAsset.init(url: yourURL, options: nil)

audioAsset.loadValuesAsynchronously(forKeys: ["duration"]) {
    var error: NSError? = nil
    let status = audioAsset.statusOfValue(forKey: "duration", error: &error)
    switch status {
    case .loaded: // Sucessfully loaded. Continue processing.
        let duration = audioAsset.duration
        let durationInSeconds = CMTimeGetSeconds(duration)
        print(Int(durationInSeconds))
        break              
    case .failed: break // Handle error
    case .cancelled: break // Terminate processing
    default: break // Handle all other cases
    }
}
 3
Author: nCr78,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-28 12:15:40