2014-09-26 2 views
7

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

audioAsset = [AVURLAsset assetWithURL:itemURL]; 

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

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

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

ответ

0

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

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

Да то же самое, я пытаюсь, чтобы первая часть вашего кода была в другом методе в моем случае, и там я получаю URL-адрес так же, как вы, так что это не prblem. –

+0

Я реализовал этот код .. и у меня есть продолжительность mp3 в журнале .... – Bhoomi

-1

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

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

Вы даже прочитали вопрос? Он сказал, что продолжительность равна 0. Форматирование его в минутах и ​​секундах совершенно не имеет никакого значения. – JRod

10

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

NSURL *itemPathURL = [NSURL URLWithString:outPath]; 

вместо

NSURL *itemPathURL = [NSURL fileURLWithPath:outPath]; 
+0

спасибо! Просто ... спасибо. – mark

0

Мне кажется, 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) 
1

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

Вы также можете использовать asset.duration.seconds –

0

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

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