Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c AVURLAsset可在ipod上播放长音_Objective C_Ios_Avfoundation - Fatal编程技术网

Objective c AVURLAsset可在ipod上播放长音

Objective c AVURLAsset可在ipod上播放长音,objective-c,ios,avfoundation,Objective C,Ios,Avfoundation,长期读者,第一次询问 我正在制作一个音乐应用程序,它使用Avassetrader从itunes库读取mp3数据。我需要精确的计时,所以当我创建一个AVURLASSETPREVERPRECISEDURATIONANDTIMINGKEY时,我使用“AVURLASSETPRECISEDURATIONAND TIMINGKEY”来提取计时数据。这有一些开销(我不使用它时没有问题,但我需要它!) 在iphone(4)和ipad(1)上,一切都很好。我希望它能在我的iPodtouch(第二代)上运行。但事实

长期读者,第一次询问

我正在制作一个音乐应用程序,它使用Avassetrader从itunes库读取mp3数据。我需要精确的计时,所以当我创建一个AVURLASSETPREVERPRECISEDURATIONANDTIMINGKEY时,我使用“AVURLASSETPRECISEDURATIONAND TIMINGKEY”来提取计时数据。这有一些开销(我不使用它时没有问题,但我需要它!)

在iphone(4)和ipad(1)上,一切都很好。我希望它能在我的iPodtouch(第二代)上运行。但事实并非如此:如果声音文件太长(>~7分钟),则Avassetrader无法开始读取并抛出错误(AVFoundationErrorDomain错误-11800)

就iPodtouch的稀缺资源而言,我似乎遇到了麻烦。您知道发生了什么,或者如何管理创建avurlaste的开销,以便它能够处理长文件吗? (我试着用性能工具运行它,但我没有看到内存中出现大的峰值)


谢谢,丹也许你也开始读了儿子?据我所知,对于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]上执行该工作。伟大的