本质上,我正在寻找连接AVAsset
文件的方法。我对要做什么有一个粗略的想法,但是我在加载音频文件方面很挣扎。
我可以使用AVAudioPlayer
播放文件,可以通过终端在目录中看到它们,但是当我尝试使用AVAssetURL
加载它们时,它总是返回一个空的音轨数组。
我正在使用的网址:
NSURL *firstAudioFileLocation = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%@", workingDirectory , @"/temp.pcm"]];
结果是:
file:///Users/evolve/Library/Developer/CoreSimulator/Devices/8BF465E8-321C-47E6-BF2E-049C5E900F3C/data/Containers/Data/Application/4A2D29B2-E5B4-4D07-AE6B-1DD15F5E59A3/Documents/temp.pcm
正在加载的 Assets :
AVAsset *test = [AVURLAsset URLAssetWithURL:firstAudioFileLocation options:nil];
但是,在调用此命令时:
NSLog(@" total tracks %@", test.tracks);
我的输出始终为
total tracks ()
。我随后的将它们添加到
AVMutableCompositionTrack
的调用最终导致应用程序崩溃,因为AVAsset
似乎未正确加载。我玩过其他加载资源的变体,包括:
NSURL *alternativeLocation = [[NSBundle mainBundle] URLForResource:@"temp" withExtension:@"pcm"];
以及尝试使用文档中的选项加载AVAsset:
NSDictionary *assetOptions = @{AVURLAssetPreferPreciseDurationAndTimingKey: @YES};
如何从
AVAudioRecorder
最近创建的本地资源中加载轨道?编辑
我戳了一下,发现可以记录和加载.CAF文件扩展名。
似乎AVAsset不支持.PCM,此页面也有很大帮助。 https://developer.apple.com/documentation/avfoundation/avfiletype
最佳答案
AVAsset负载不是瞬时的。您需要等待数据可用。例子:
AVAsset *test = [AVURLAsset URLAssetWithURL:firstAudioFileLocation options:nil];
[test loadValuesAsynchronouslyForKeys:@[@"playable",@"tracks"] completionHandler:^{
// Now tracks is available
NSLog(@" total tracks %@", test.tracks);
}];
可以找到更详细的示例in the documentation。