2014-09-26 18 views
7

Ich versuche, die Dauer der Audiodateien zum Beschneiden, sie zu erhalten, ist mir den Code unten verwenden,AVURLAsset kehrt Dauer als 0

audioAsset = [AVURLAsset assetWithURL:itemURL]; 

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

wenn ich itemURL jede Audiodatei der Medienbibliothek zur Verfügung stellen, ich bekomme die richtige Dauer, und dann kann ich die Audiodatei schneiden. Dann speichere ich die getrimmte Audiodatei im Dokumentenverzeichnis. Aber wenn ich versuche, die bereits beschnittene Datei zu schneiden, gibt mir derselbe Code 0 als Dauer zurück. Allerdings kann ich die beschnittene Datei wiedergeben und die Dauer mit AVAudioPlayer abrufen, aber was ist das Problem mit AVURLAsset, das ich nicht herausfinden kann.

Kann jemand helfen? Ich habe schon fast alle Antworten einer solchen Frage im Stackoverflow ausprobiert.

Antwort

0

Versuchen wie folgt .....

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

Ja, um die Die gleiche Sache, die ich versuche, ist der erste Teil deines Codes in einer anderen Methode in meinem Fall und dort bekomme ich die URL gerade wie du, also ist das nicht das Prblem. –

+0

ich habe diesen Code implementiert..und ich habe die Dauer von mp3 im Log .... – Bhoomi

-1

Try this ....

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

Hast du überhaupt die Frage gelesen? Er sagte, dass die Dauer 0 war. Das Formatieren in Minuten und Sekunden macht überhaupt keinen Unterschied. – JRod

10

Wahrscheinlich haben Sie verwendet

NSURL *itemPathURL = [NSURL URLWithString:outPath]; 

statt

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

danke! Nur ... danke. – mark

0

Ich denke AVURLAsset muss die Typerweiterung Ihrer Datei kennen, um ihre Dauer zu berechnen. Sie speichern Ihre Datei wahrscheinlich als {fileName} und nicht als {fileName}.{extension}.

Wenn Sie den folgenden Code mit yourFileName ohne Erweiterung, die Sie *** Could not find format reader for URL erhalten, und der Rückgabewert 0.

import AVFoundation 

let fileName = *yourFileName* 
let url = NSURL(fileURLWithPath: fileName) 
let asset = AVURLAsset(URL: url, options: nil) 
println(asset.duration.value.description) 
1

für Swift 3.0 und höher

Import 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

Sie können auch asset.duration.seconds verwenden –

0

für meinen Fall, die Extensi des Dateinamens auf muss erkannt werden, wie ".mp3". wenn nicht, wird es zurückgeben 0

... lassen Asset = AVURLAsset (url: URL (fileURLWithPath: Filefullname), Optionen: null) ... asset.duration ...