AVAsset轨道为空

Mal*_*lii 5 objective-c avfoundation ios

本质上,我正在寻找连接AVAsset文件的方法。我对要做什么有一个大概的了解,但是我在加载音频文件方面很挣扎。

我可以使用播放文件AVAudioPlayer,也可以通过终端在目录中看到它们,但是当我尝试用它们加载文件时AVAssetURL,总是会返回一个空的音轨数组。

我正在使用的网址:

NSURL *firstAudioFileLocation = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%@", workingDirectory , @"/temp.pcm"]];
Run Code Online (Sandbox Code Playgroud)

结果是:

file:///Users/evolve/Library/Developer/CoreSimulator/Devices/8BF465E8-321C-47E6-BF2E-049C5E900F3C/data/Containers/Data/Application/4A2D29B2-E5B4-4D07-AE6B-1DD15F5E59A3/Documents/temp.pcm
Run Code Online (Sandbox Code Playgroud)



正在加载的资产:

AVAsset *test = [AVURLAsset URLAssetWithURL:firstAudioFileLocation options:nil];
Run Code Online (Sandbox Code Playgroud)

但是,当调用此:

NSLog(@" total tracks %@", test.tracks);
Run Code Online (Sandbox Code Playgroud)

我的输出总是total tracks ()

我后来将它们添加到我的调用AVMutableCompositionTrack最终导致应用程序崩溃,因为AVAsset似乎未正确加载。



我玩过其他加载资源的方法,包括:

NSURL *alternativeLocation = [[NSBundle mainBundle] URLForResource:@"temp" withExtension:@"pcm"];
Run Code Online (Sandbox Code Playgroud)

以及尝试使用文档中的选项加载AVAsset:

NSDictionary *assetOptions = @{AVURLAssetPreferPreciseDurationAndTimingKey: @YES};
Run Code Online (Sandbox Code Playgroud)



如何从最近创建的本地资源加载曲目AVAudioRecorder

编辑

我戳了一下,发现可以记录和加载.CAF文件扩展名。

似乎AVAset不支持.PCM,此页面也有很大帮助。https://developer.apple.com/documentation/avfoundation/avfiletype

Ger*_*d K 7

AVAsset负载不是瞬时的。您需要等待数据可用。例:

AVAsset *test = [AVURLAsset URLAssetWithURL:firstAudioFileLocation options:nil];
[test loadValuesAsynchronouslyForKeys:@[@"playable",@"tracks"] completionHandler:^{

    // Now tracks is available
    NSLog(@" total tracks %@", test.tracks);
}];
Run Code Online (Sandbox Code Playgroud)

可以在文档中找到更详细的示例。

  • 这有很大帮助,但它仍然返回一个空数组。使用 AVKeyValueStatus 查看后,AVAsset 似乎不支持线性 PCM?我是否误解了?是否有支持的组合类型列表? (2认同)