从AVAssetReaderOutput读取数据时iOS 5.0崩溃

我有这个代码片段用于从AVAssetReaderOutput读取数据,该方法在iOS 4.0中工作正常,但是在5.0中它崩溃到最后与不良访问,不知道为什么,任何人有任何input?

 AVAssetReaderOutput *output=[myOutputs objectAtIndex:0]; int totalBuff=0; while(TRUE) { CMSampleBufferRef ref=[output copyNextSampleBuffer]; if(ref==NULL) break; //copy data to file //read next one AudioBufferList audioBufferList; NSMutableData *data=[[NSMutableData alloc] init]; CMBlockBufferRef blockBuffer; CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(ref, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer); for( int y=0; y<audioBufferList.mNumberBuffers; y++ ) { AudioBuffer audioBuffer = audioBufferList.mBuffers[y]; Float32 *frame = audioBuffer.mData; NSLog(@"Gonna write %d", audioBuffer.mDataByteSize); //crashes here [data appendBytes:frame length:audioBuffer.mDataByteSize]; } totalBuff++; CFRelease(blockBuffer); CFRelease(ref); [fileHandle writeData:data]; [data release]; } 

谢谢

丹尼尔

我实际上通过检查blockBuffer是否为null来解决这个问题,如果是的话,问题在于ref不是null,但是blockBuffer是这样的代码解决了我的问题

 -(void)doExportSong:(NSURL*)url toFileUrl:(NSString*)fileURL { AVURLAsset *asset=[[[AVURLAsset alloc] initWithURL:url options:nil] autorelease]; AVAssetReader *reader=[[[AVAssetReader alloc] initWithAsset:asset error:nil] autorelease]; [reader setTimeRange:CMTimeRangeMake(kCMTimeZero, kCMTimePositiveInfinity)]; NSMutableArray *myOutputs =[[NSMutableArray alloc] init]; for(id track in [asset tracks]) { AVAssetReaderTrackOutput *ot=[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track outputSettings:nil]; [myOutputs addObject:ot]; [reader addOutput:ot]; } [reader startReading]; NSFileHandle *fileHandle ; NSFileManager *fm=[NSFileManager defaultManager]; if(![fm fileExistsAtPath:fileURL]) { [fm createFileAtPath:fileURL contents:[[[NSData alloc] init] autorelease] attributes:nil]; } fileHandle=[NSFileHandle fileHandleForUpdatingAtPath:fileURL]; [fileHandle seekToEndOfFile]; AVAssetReaderOutput *output=[myOutputs objectAtIndex:0]; int totalBuff=0; BOOL one=TRUE; while(TRUE) { CMSampleBufferRef ref=[output copyNextSampleBuffer]; // NSLog(@"%@",ref); if(ref==NULL) break; //copy data to file //read next one AudioBufferList audioBufferList; NSMutableData *data=[[NSMutableData alloc] init]; CMBlockBufferRef blockBuffer; CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(ref, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer); // NSLog(@"%@",blockBuffer); if(blockBuffer==NULL) { [data release]; continue; } if(&audioBufferList==NULL) { [data release]; continue; } for( int y=0; y<audioBufferList.mNumberBuffers; y++ ) { AudioBuffer audioBuffer = audioBufferList.mBuffers[y]; Float32 *frame = (Float32*)audioBuffer.mData; [data appendBytes:frame length:audioBuffer.mDataByteSize]; } totalBuff++; CFRelease(blockBuffer); CFRelease(ref); ref=NULL; blockBuffer=NULL; [fileHandle writeData:data]; [data release]; } [fileHandle closeFile]; [myOutputs release]; }