Objective c AVURLAsset可在ipod上播放长音
长期读者,第一次询问 我正在制作一个音乐应用程序,它使用Avassetrader从itunes库读取mp3数据。我需要精确的计时,所以当我创建一个AVURLASSETPREVERPRECISEDURATIONANDTIMINGKEY时,我使用“AVURLASSETPRECISEDURATIONAND TIMINGKEY”来提取计时数据。这有一些开销(我不使用它时没有问题,但我需要它!) 在iphone(4)和ipad(1)上,一切都很好。我希望它能在我的iPodtouch(第二代)上运行。但事实并非如此:如果声音文件太长(>~7分钟),则Avassetrader无法开始读取并抛出错误(AVFoundationErrorDomain错误-11800) 就iPodtouch的稀缺资源而言,我似乎遇到了麻烦。您知道发生了什么,或者如何管理创建avurlaste的开销,以便它能够处理长文件吗? (我试着用性能工具运行它,但我没有看到内存中出现大的峰值)Objective c AVURLAsset可在ipod上播放长音,objective-c,ios,avfoundation,Objective C,Ios,Avfoundation,长期读者,第一次询问 我正在制作一个音乐应用程序,它使用Avassetrader从itunes库读取mp3数据。我需要精确的计时,所以当我创建一个AVURLASSETPREVERPRECISEDURATIONANDTIMINGKEY时,我使用“AVURLASSETPRECISEDURATIONAND TIMINGKEY”来提取计时数据。这有一些开销(我不使用它时没有问题,但我需要它!) 在iphone(4)和ipad(1)上,一切都很好。我希望它能在我的iPodtouch(第二代)上运行。但事实
谢谢,丹也许你也开始读了儿子?据我所知,对于mp3,它需要遍历整个文件以实现精确计时。所以,试着推迟阅读。 您还可以尝试注册为某些AVAsset属性的观察者。iOS 4.3具有“可读”属性。我从未尝试过,但我猜它最初设置为“否”,一旦AVAsset完成加载,它就会设置为“是” 编辑: 事实上,我刚查过文件。你应该使用AVAsynchronousKeyValueLoading协议,苹果提供了一个例子
NSURL *url = <#A URL that identifies an audiovisual asset such as a movie file#>;
AVURLAsset *anAsset = [[AVURLAsset alloc] initWithURL:url options:nil];
NSArray *keys = [NSArray arrayWithObject:@"duration"];
[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^() {
NSError *error = nil;
AVKeyValueStatus durationStatus = [asset statusOfValueForKey:@"duration" error:&error];
switch (durationStatus) {
case AVKeyValueStatusLoaded:
[self updateUserInterfaceForDuration];
break;
case AVKeyValueStatusFailed:
[self reportError:error forAsset:asset];
break;
case AVKeyValueStatusCancelled:
// Do whatever is appropriate for cancelation.
break;
}
}];
NSURL*url=;
AVURLAsset*anAsset=[[AVURLAsset alloc]initWithURL:url选项:nil];
NSArray*键=[NSArray arrayWithObject:@“duration”];
[asset LoadValuesSynchronouslyForkeys:keys completionHandler:^(){
n错误*错误=nil;
AVKeyValueStatus durationStatus=[资产状态的ValueForKey:@“duration”错误:&错误];
开关(持续状态){
案例AVKeyValueStatusLoaded:
[self updateUserInterfaceForDuration];
打破
案例AVKeyValueStatusFailed:
[自我报告错误:资产集错误:资产];
打破
案例AVKeyValueStatusCancelled:
//做任何适合取消的事情。
打破
}
}];
如果“duration”不能帮助尝试“readable”(但正如我前面提到的,“readable”需要4.3)。也许这会解决你的问题。你好,亚历克斯,谢谢!我一直在使用“loadValuesAsynchronouslyForKeys”协议,但我一直在使用“tracks”键,而不是“duration”。看来,在“duration”上运行它确实会将开销计时查找工作转移到异步线程上,而不是在[Avassetrader startReading]上执行该工作。伟大的