AVURLAsset tracksWithMediaType在Simulator中不返回AVMediaTypeAudio的audioTracks

时间:2016-07-03 11:41:57

标签: ios objective-c avasset

我正在做以下

    AVURLAsset              *audioAsset  = [[AVURLAsset alloc] initWithURL:audioUrl options:nil];
    NSArray<AVAssetTrack *> *audioTracks = [audioAsset tracksWithMediaType:AVMediaTypeAudio];

在真实设备上工作正常。

问题恰好发生在模拟器中。我在捆绑中有一个静态添加的mp3,因此audioAsset已正确启动。但是数组audioTracks在模拟器上是空的(即使audioUrl中的路径和audioAsset变量是正确且存在的。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

我也在真实设备上面临同样的问题。这个问题是由于在初始化资产之后它还没有准备就绪。

请查看documentation

  

您可以使用现有资源初始化播放器项目,也可以直接从URL初始化播放器项目,以便您可以在特定位置播放资源(然后AVPlayerItem将为资源创建和配置资源)。但是,与AVAsset一样,简单地初始化播放器项并不一定意味着它可以立即播放。您可以观察(使用键值观察)项目的状态属性,以确定它是否以及何时可以播放。

要解决此问题,您可以尝试执行以下操作:

AVURLAsset *audioAsset = [[AVURLAsset alloc] initWithURL:audioUrl options:nil];
NSString *tracksKey = @"tracks";
[audioAsset loadValuesAsynchronouslyForKeys:@[tracksKey] completionHandler:
 ^{
    NSError *error;
    AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error];
    if (status == AVKeyValueStatusLoaded) { 
        // The asset is ready at this point
        NSArray<AVAssetTrack *> *audioTracks = [audioAsset tracksWithMediaType:AVMediaTypeAudio];
     }
 }];

另外值得注意的是,如果audioAsset不可播放,AVKeyValueStatus状态可以是AVKeyValueStatusFailed:

BOOL result = [audioAsset isPlayable];