// // GPUImageMovieComposition.m // Givit // // Created by Sean Meiners on 2013/01/25. // // #import "GPUImageMovieComposition.h" #import "GPUImageMovieWriter.h" @implementation GPUImageMovieComposition @synthesize compositon = _compositon; @synthesize videoComposition = _videoComposition; @synthesize audioMix = _audioMix; - (id)initWithComposition:(AVComposition*)compositon andVideoComposition:(AVVideoComposition*)videoComposition andAudioMix:(AVAudioMix*)audioMix { if (!(self = [super init])) { return nil; } [self yuvConversionSetup]; self.compositon = compositon; self.videoComposition = videoComposition; self.audioMix = audioMix; return self; } - (AVAssetReader*)createAssetReader { //NSLog(@"creating reader from composition: %@, video: %@, audio: %@ with duration: %@", _compositon, _videoComposition, _audioMix, CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, _compositon.duration))); NSError *error = nil; AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:self.compositon error:&error]; NSDictionary *outputSettings = @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)}; AVAssetReaderVideoCompositionOutput *readerVideoOutput = [AVAssetReaderVideoCompositionOutput assetReaderVideoCompositionOutputWithVideoTracks:[_compositon tracksWithMediaType:AVMediaTypeVideo] videoSettings:outputSettings]; #if ! TARGET_IPHONE_SIMULATOR if( [_videoComposition isKindOfClass:[AVMutableVideoComposition class]] ) [(AVMutableVideoComposition*)_videoComposition setRenderScale:1.0]; #endif readerVideoOutput.videoComposition = self.videoComposition; readerVideoOutput.alwaysCopiesSampleData = NO; [assetReader addOutput:readerVideoOutput]; NSArray *audioTracks = [_compositon tracksWithMediaType:AVMediaTypeAudio]; BOOL shouldRecordAudioTrack = (([audioTracks count] > 0) && (self.audioEncodingTarget != nil) ); AVAssetReaderAudioMixOutput *readerAudioOutput = nil; if (shouldRecordAudioTrack) { [self.audioEncodingTarget setShouldInvalidateAudioSampleWhenDone:YES]; readerAudioOutput = [AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:audioTracks audioSettings:nil]; readerAudioOutput.audioMix = self.audioMix; readerAudioOutput.alwaysCopiesSampleData = NO; [assetReader addOutput:readerAudioOutput]; } return assetReader; } @end