Question

i wrote the code like below and i am getting the memory leak at line:

 AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetPassthrough];

My Code is:

NSError *error;
AVMutableComposition* mixComposition = [AVMutableComposition composition];


NSURL*    audio_inputFileUrl = [_songPath valueForProperty:MPMediaItemPropertyAssetURL];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;

NSString *video_inputFilePath = [documentsDirectory stringByAppendingPathComponent:@"videoOutput1234videoOutput1234.mp4"];
NSLog(@"output url %@",video_inputFilePath);

NSURL*    video_inputFileUrl = [NSURL fileURLWithPath:video_inputFilePath];


NSArray *docPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath=[docPaths objectAtIndex:0];
NSString* outputFilePath = [docPath stringByAppendingPathComponent:@"OutPut.mov"];//[[NSBundle mainBundle] pathForResource:@"OutPut" ofType:@"mov"];
NSURL*    outputFileUrl = [NSURL fileURLWithPath:outputFilePath];

if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath]) 
{
    [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil];
}
else {
    NSString *defaultPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"OutPut.mov"];
    [[NSFileManager defaultManager] copyItemAtPath:defaultPath toPath:outputFilePath error:&error];
    [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil];
}



CMTime nextClipStartTime = kCMTimeZero;

AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:video_inputFileUrl options:nil];
CMTimeRange video_timeRange = CMTimeRangeMake(kCMTimeZero,videoAsset.duration);
AVMutableCompositionTrack *a_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

[a_compositionVideoTrack insertTimeRange:video_timeRange ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil];


AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audio_inputFileUrl options:nil];
CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration);
AVMutableCompositionTrack *b_compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
[b_compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:nextClipStartTime error:nil];
if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath]) 
    [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil];

AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetPassthrough];   
_assetExport.outputFileType = @"com.apple.quicktime-movie";
_assetExport.outputURL = outputFileUrl;

if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath]) 
    [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil];

[_assetExport exportAsynchronouslyWithCompletionHandler:^(void ) {[self saveVideoToAlbum:outputFilePath]; }       ];    

[outputFileUrl release];
[videoAsset release];
[audioAsset release];
if (_assetExport.status == 2) {
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Exporting to library is completed" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK",nil];
    [alertView show];
    [alertView release];
    [mixComposition release];
}

when i tried to release AVASSETEXPORTSESSION my app is crashing and i don't have ay idea how to release this

can you please tell me the answer.

Was it helpful?

Solution

You don't need to release:

[outputFileUrl release];
[mixComposition release];

Remove these lines from Your code. You need to do that because You do not own them (not allocated). So You do not need to release them.

And then it should work now.

Autorelease:

AVAssetExportSession* _assetExport = [[[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetPassthrough] autorelease];

or release:

[_assetExport release];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top