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
Попаднах на подобен проблем при отваряне на локален файл. Моето решение беше да включа asset.init() след 'asset = AVURLAsset(...)' След това продължителността беше попълнена с правилната дължина на филма. Пиша на C#, така че може да има разлики. Но попаднах на тази тема, докато се опитвах да намеря решение. - person Morten; 07.04.2020

За Swift 3.0 и по-нова версия

импортиране на AV Foundation

  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
Можете също да използвате asset.duration.seconds - person Dmitry Kozlov; 24.01.2018

за моя случай разширението на името на файла трябва да бъде разпознато, като ".mp3". ако не, ще върне 0.

... нека актив = AVURLAsset(url: URL(fileURLWithPath: filefullname), опции: нула) ... asset.duration ...

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