我正在做以下
AVURLAsset *audioAsset = [[AVURLAsset alloc] initWithURL:audioUrl options:nil];
NSArray<AVAssetTrack *> *audioTracks = [audioAsset tracksWithMediaType:AVMediaTypeAudio];
在真实设备上工作正常。
问题恰好发生在模拟器中。我在捆绑中有一个静态添加的mp3,因此audioAsset
已正确启动。但是数组audioTracks
在模拟器上是空的(即使audioUrl
中的路径和audioAsset
变量是正确且存在的。
有什么建议吗?
答案 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];