AVURLAsset无法在文档目录中获取mp3持续时间,但它适用于应用程序包中的mp3

时间:2015-01-17 06:59:30

标签: ios avfoundation

我有两个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"。为什么呢?

2 个答案:

答案 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];

(我把选项固定在静态中,所以我不必继续重新创建和处理它。)

如果您在文档与应用包中的资源标记不同,则可能是您的问题。