我有两个mp3文件。一个是app app,另一个是用户的Documents目录。我想获得mp3文件的持续时间。
AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:[NSURL URLWithString:newPath] options:nil];
[audioAsset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler:^{
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
NSLog(@"duration:%f",audioDurationSeconds);
}];
这些代码适用于应用程序包中的mp3文件,但它不能与Documents目录中的mp3一起使用,该目录只记录"持续时间:0.000000"。为什么呢?
答案 0 :(得分:1)
以下是一种组合与文档目录中的mp3文件关联的路径的方法。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Professor_and_the_Plant.mp3"];
NSURL *mp3_url = [[NSURL alloc] initFileURLWithPath:path];
答案 1 :(得分:0)
NSURLAsset默认为快速工作。如果长度或元数据不容易获得(即在ID3标题中),则不会产生它。要求正确的数据,即使需要更长的时间,也必须给出选项:
static NSDictionary *options;
if (!options) {
NSNumber *val = [[NSNumber alloc] initWithBool: YES];
options = [[NSDictionary alloc] initWithObjectsAndKeys:val, AVURLAssetPreferPreciseDurationAndTimingKey, nil];
}
AVAsset *asset = [[AVURLAsset alloc] initWithURL:url options:options];
(我把选项固定在静态中,所以我不必继续重新创建和处理它。)
如果您在文档与应用包中的资源标记不同,则可能是您的问题。