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