iPhone: получить длительность аудио файла - PullRequest
8 голосов
/ 07 августа 2009

Какой самый простой способ получить длительность аудиофайла?

Я мог бы создать объект AVAudioPlayer, инициализировать его с помощью URL и затем получить длительность, но этот путь слишком длинный. Есть ли более простой способ?

Спасибо.

Ответы [ 8 ]

14 голосов
/ 20 июля 2012

Правильный код

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

outDataSize должен быть Float64, а не UInt64.

9 голосов
/ 08 августа 2009

Вы можете использовать функции Audio File Services. Есть одно свойство, которое должно дать вам предполагаемую продолжительность. Код:

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

Вы можете проверить документы здесь

2 голосов
/ 30 октября 2015

Объединение AVAudioPlayer со Swift становится таким же простым, как (я переношу таблицу областей ниже, но вы поняли):

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)
2 голосов
/ 08 августа 2009

Это зависит от типа файла. Если это файл WAV, вы можете найти заголовок файла и таким образом определить продолжительность воспроизведения. Если это сжатый формат (* .mp3 и т. Д.), Лучше придерживаться упомянутого вами метода.

2 голосов
/ 07 августа 2009

Если вам известно что-либо о рассматриваемом аудиофайле (частота дискретизации, разрядность, число каналов) и это несжатый формат (WAV / AIFF), то вы можете рассчитать / приблизительную / длительность из размера файла:

length_in_seconds = (file_length-guess_100_bytes_for_header) / (частота дискретизации * (bitdepth * channel_count / 8))

1 голос
/ 11 августа 2016
 AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:mp3_url options:nil];
                    [audioAsset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler:^{
                        CMTime audioDuration = audioAsset.duration;
                        float audioDurationSeconds = CMTimeGetSeconds(audioDuration);

                        NSLog(@"duration:%f",audioDurationSeconds);
                    }];
1 голос
/ 30 октября 2013

пример кода из ответа Как узнать длительность аудиофайла в iOS? . Это лучший ответ.

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

1 голос
/ 15 августа 2013

В случае, если кто-то приземлится здесь в поисках способа получения продолжительности для аудио- и видеофайлов, взгляните на этот ответ на другой пост, который вместо этого использует AVAsset вместо:

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

Использование AudioFileGetProperty (как и два других основных ответа здесь) для получения продолжительности аудио / видео файлов не работает для нескольких .mov файлов на моем устройстве (результат всегда был 0) в то время как решение, использующее AVAsset, получило продолжительность для всех аудио и видео файлов на моем устройстве.

(Интересно, однако, что продолжительность обоих решений иногда была на 1 секунду больше, чем отображаемая в пользовательском интерфейсе фактического AVAudioPlayer. Скорее всего, AVAudioPlayer использует нестандартную процедуру округления для отображаемой длительности. )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...