Как получить продолжительность аудиофайла в iOS?

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

из ключей атрибутов файла вы можете получить дату, размер и т. д. Но как вы получаете продолжительность?

4 ответов


на "ключи атрибутов файла"NSFileManager ссылка на класс вы можете видеть, что нет ключа для использования, который вернет продолжительность песни. Вся информация, что NSFileManager экземпляр получает около файла в свойствах самого файла в операционной системе, такие как размер файла. The NSFileManager не может интерпретировать файл.

для того, чтобы получить продолжительность файла, необходимо использовать класс, который знает, как интерпретировать файл. The AVFoundation framework предоставляет точный класс, который вам нужен,AVAsset. Вы можете создать экземпляр этого абстрактного класса, используя конкретный подкласс AVURLAsset, а затем предоставить его NSURL что указывает на аудиофайл, который вы хотите получить продолжительность. Затем вы можете получить продолжительность от AVAsset например, запрашивая его duration собственность.

например:

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

обратите внимание, что AVFoundation разработан как сильно асинхронная платформа для повышения производительности и общего пользовательского опыта. Даже выполнение простых задач, таких как запрос длительности файла мультимедиа, может занять много времени и привести к зависанию приложения. Вы должны использовать протокол AVAsynchronousKeyValueLoading для асинхронной загрузки длительности песни и затем обновите пользовательский интерфейс в блоке обработчика завершения. Вы должны взглянуть на 'Руководство По Программированию Блоков' а также видео WWDC2010 под названием "Discovering AV Foundation", которое доступно бесплатно по адресу https://developer.apple.com/videos/wwdc/2010.


для полноты-есть еще один способ получить продолжительность для mp3-файла:

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

double duration = avAudioPlayer.duration; 
avAudioPlayer = nil;

я использовал это без заметной задержки.


вы можете добиться того же в Swift с помощью :

let audioAsset = AVURLAsset.init(url: audioFileURL, options: nil)
let duration = audioAsset.duration
let durationInSeconds = CMTimeGetSeconds(duration)

для тех, кто все еще ищет это. Основываясь на ответе, код для Swift 4 (включая асинхронную загрузку значений, взятых из документации 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
    }
}