我正在做以下

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

在真实设备上可以正常工作。

问题仅发生在模拟器中。我在捆绑包中静态添加了mp3,因此audioAsset已正确启动。但是,数组audioTracks在模拟器上为空(即使audioUrlaudioAsset变量中的路径正确且存在)。

有什么建议?

最佳答案

我在真实设备上也遇到过同样的问题。该问题是由于初始化资产后尚未准备就绪而引起的。

请看看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];

关于ios - AVURLAssettracksWithMediaType在模拟器中不返回AVMediaTypeAudio的audioTracks,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38169589/

10-10 20:01