AVURLAsset возвращает продолжительность как 0

Я пытаюсь получить продолжительность аудиофайлов для их обрезки, я использую приведенный ниже код:

audioAsset = [AVURLAsset assetWithURL:itemURL];

CMTime assetTime = [audioAsset duration];
Float64 duration = CMTimeGetSeconds(assetTime);

когда я предоставляю itemURL любого аудиофайла медиатеки, я получаю правильную продолжительность, а затем могу обрезать аудиофайл. Затем я сохраняю обрезанный аудиофайл в каталоге документов. Но когда я пытаюсь обрезать уже обрезанный файл, тот же код возвращает мне 0 в качестве продолжительности. Однако я могу воспроизвести обрезанный файл и получить продолжительность с помощью AVAudioPlayer, но в чем проблема с AVURLAsset, я не могу понять.

Кто-нибудь может помочь? Я уже пробовал почти все ответы на этот вопрос в stackoverflow.


person Rameswar Prasad    schedule 26.09.2014    source источник


Ответы (6)


Вероятно, вы использовали

  NSURL *itemPathURL = [NSURL URLWithString:outPath];

вместо

NSURL *itemPathURL = [NSURL fileURLWithPath:outPath];
person Mr.G    schedule 28.05.2015

Я думаю, что AVURLAsset нужно знать расширение типа вашего файла, чтобы вычислить его продолжительность. Вероятно, вы храните свой файл как {fileName}, а не как {fileName}.{extension}.

Если вы запустите следующий код с yourFileName без расширения, вы получите *** Could not find format reader for URL и вернете значение 0.

import AVFoundation

let fileName = *yourFileName*
let url = NSURL(fileURLWithPath: fileName)
let asset = AVURLAsset(URL: url, options: nil)
println(asset.duration.value.description)
person Cale    schedule 02.06.2015
comment
Я столкнулся с подобной проблемой при открытии локального файла. Мое решение состояло в том, чтобы включить assets.init() после 'asset = AVURLAsset(...)'. Затем продолжительность была заполнена правильной продолжительностью фильма. Я пишу на C#, поэтому могут быть различия. Но я приземлился на эту тему, пытаясь найти решение. - person Morten; 07.04.2020

Для Swift 3.0 и выше

импортировать AVFoundation

  let asset = AVAsset(url: URL(fileURLWithPath: ("Your File Path here")!))
  let totalSeconds = Int(CMTimeGetSeconds(asset.duration))
  let minutes = totalSeconds / 60
  let seconds = totalSeconds % 60
  let mediaDuration = String(format:"%02i:%02i",minutes, seconds)
person Hiren Panchal    schedule 29.12.2016
comment
Вы также можете использовать assets.duration.seconds - person Dmitry Kozlov; 24.01.2018

в моем случае расширение имени файла должно быть распознано, например «.mp3». если нет, он вернет 0.

... пусть актив = AVURLAsset (url: URL (fileURLWithPath: полное имя файла), параметры: ноль) ... актив.длительность ...

person Haiyuan    schedule 03.02.2017

Попробуйте следующее.....

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask,   YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *getAudioPath = [documentsDirectory stringByAppendingPathComponent:@"song.mp3"];
NSURL *finalUrl=[[NSURL alloc]initFileURLWithPath:getAudioPath];
NSLog(@"finalUrl===%@",finalUrl);
AVURLAsset *asset = [AVURLAsset assetWithURL: finalUrl];
duration = CMTimeGetSeconds(asset.duration);
NSLog(@"duration==%f",duration);
person Bhoomi Jagani    schedule 26.09.2014
comment
Да, то же самое, что я пытаюсь сделать, первая часть вашего кода в моем случае находится в другом методе, и я получаю URL-адрес так же, как и вы, так что это не проблема. - person Rameswar Prasad; 26.09.2014

Попробуй это....

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:Yoururl options:nil];
CMTime time = asset.duration;
double durationInSeconds = CMTimeGetSeconds(time);
int minutes = floor(durationInSeconds/60);
int seconds = round(durationInSeconds - (minutes * 60));
NSString * duration = [NSString stringWithFormat:@"%i:%i",minutes,seconds];
NSLog(@"Duration : %@", duration);
person Hiren Varu    schedule 06.10.2014
comment
Вы хоть читали вопрос? Он сказал, что продолжительность равна 0. Форматирование в минуты и секунды не имеет абсолютно никакого значения. - person JRod; 20.05.2015