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

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

audioAsset = [AVURLAsset assetWithURL:itemURL];

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

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

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

6 ответов

Возможно, вы использовали

  NSURL *itemPathURL = [NSURL URLWithString:outPath];

вместо

NSURL *itemPathURL = [NSURL fileURLWithPath:outPath];

Я думаю 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)

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

... let asset = AVURLAsset (url: URL (fileURLWithPath: filefullname), параметры: nil) ... asset.duration ...

Для 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)

Попробуйте как следует.....

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

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

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);
Другие вопросы по тегам