iOS 5.0 crash when reading data from an AVAssetReaderOutput

前端 未结 1 1106
甜味超标
甜味超标 2020-12-15 02:20

I have this snippet of code used to read data from an AVAssetReaderOutput, the method works fine in iOS 4.0, however in 5.0 it crashes towards the end with bad

1条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-15 02:39

    I actually fixed this by checking that blockBuffer was null and continuing if it was, the problem was that ref was not null but the blockBuffer was so this code fixed my issue

    -(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

    0 讨论(0)
提交回复
热议问题