ios - exportAsynchronouslyWithCompletionHandler calls once -
i tried asking before, got no responses. i'll try again. i'm trying lay images on top of video (like doodle, or border). call "addanimation" method 3 times, , runs, exportasynchronouslywithcompletionhandler gets called on first try. ideas?
- (void)addanimation:(uiimage *)background for:(nsstring *)socialsite { // 1 - load asset avurlasset* videoasset = [avurlasset urlassetwithurl:self.videourl options:nil]; // 2 - create avmutablecomposition object avmutablecomposition* mixcomposition = [avmutablecomposition composition]; // 2.1 - videotrack avmutablecompositiontrack *compositionvideotrack = [mixcomposition addmutabletrackwithmediatype:avmediatypevideo preferredtrackid:kcmpersistenttrackid_invalid]; // 2.2 - audiotrack avmutablecompositiontrack *compositionaudiotrack = [mixcomposition addmutabletrackwithmediatype:avmediatypeaudio preferredtrackid:kcmpersistenttrackid_invalid]; //if either of them nil, alloc if( (self.clipvideotrack == nil) || (self.clipaudiotrack == nil)){ self.clipvideotrack = [[videoasset trackswithmediatype:avmediatypevideo] objectatindex:0]; self.clipaudiotrack = [[videoasset trackswithmediatype:avmediatypeaudio] objectatindex:0]; } [compositionvideotrack inserttimerange:cmtimerangemake(kcmtimezero, videoasset.duration) oftrack:self.clipvideotrack attime:kcmtimezero error:nil]; [compositionaudiotrack inserttimerange:cmtimerangemake(kcmtimezero, videoasset.duration) oftrack:self.clipaudiotrack attime:kcmtimezero error:nil]; cgsize videosize = [self.clipvideotrack naturalsize]; // 3 - background layer uiimage *myimage = background; calayer *alayer = [calayer layer]; if(socialsite == nil) { alayer.contents = (id)myimage.cgimage; if(__iphone_4_inch) alayer.frame = cgrectmake(0, 0, 640, 640); else alayer.frame = cgrectmake(0, 0, 320, 320); } else{ alayer.contents = (id)myimage.cgimage; alayer.frame = cgrectmake(0, 0, myimage.size.width, myimage.size.height); } // 3.1 - video layer calayer *parentlayer = [calayer layer]; calayer *videolayer = [calayer layer]; parentlayer.frame = cgrectmake(0, 0, myimage.size.width, myimage.size.height); if(socialsite == nil){ videolayer.frame = cgrectmake(0, 0, videosize.width, videosize.height); } else{ videolayer.frame = cgrectmake(0, 110, videosize.width, videosize.height); } [parentlayer addsublayer:videolayer]; [parentlayer addsublayer:alayer]; // 3.2 - add instructions avmutablevideocomposition* videocomp = [avmutablevideocomposition videocomposition]; videocomp.rendersize = videosize; videocomp.frameduration = cmtimemake(1, 30); videocomp.animationtool = [avvideocompositioncoreanimationtool videocompositioncoreanimationtoolwithpostprocessingasvideolayer:videolayer inlayer:parentlayer]; avmutablevideocompositioninstruction *instruction = [avmutablevideocompositioninstruction videocompositioninstruction]; instruction.timerange = cmtimerangemake(kcmtimezero, [mixcomposition duration]); avassettrack *videotrack = [[mixcomposition trackswithmediatype:avmediatypevideo] objectatindex:0]; avmutablevideocompositionlayerinstruction* layerinstruction = [avmutablevideocompositionlayerinstruction videocompositionlayerinstructionwithassettrack:videotrack]; instruction.layerinstructions = [nsarray arraywithobject:layerinstruction]; videocomp.instructions = [nsarray arraywithobject: instruction]; avassetexportsession *assetexport = [[avassetexportsession alloc] initwithasset:mixcomposition presetname:avassetexportpresethighestquality];//avassetexportpresetpassthrough assetexport.videocomposition = videocomp; // 4 - path nsarray *paths = nssearchpathfordirectoriesindomains(nsdocumentdirectory, nsuserdomainmask, yes); nsstring *documentsdirectory = [paths objectatindex:0]; nsstring *mypathdocs = [documentsdirectory stringbyappendingpathcomponent: [nsstring stringwithformat:@"finalvideo-%d.mov",arc4random() % 1000]]; nsurl *url = [nsurl fileurlwithpath:mypathdocs]; mypathdocs = [mypathdocs stringbyaddingpercentescapesusingencoding:nsutf8stringencoding]; // 5 - create exporter avassetexportsession *exporter = [[avassetexportsession alloc] initwithasset:mixcomposition presetname:avassetexportpresethighestquality]; exporter.outputurl=url; exporter.outputfiletype = avfiletypequicktimemovie; exporter.shouldoptimizefornetworkuse = yes; exporter.videocomposition = videocomp; [exporter exportasynchronouslywithcompletionhandler:^ { nsdata *video; /*********************************** instagram *********************************************/ if([socialsite isequaltostring:@"instagram"]){ video = [nsdata datawithcontentsofurl:exporter.outputurl]; [mpocreatempmanager sharedmanager].createdmarcopolo.instagramvideo = video; nslog(@"ig size (in createviewcontroller): %lu",(unsigned long)[mpocreatempmanager sharedmanager].createdmarcopolo.instagramvideo.length); } /*********************************** fb/twitter *********************************************/ else if ([socialsite isequaltostring:@"facebook"]){ video = [nsdata datawithcontentsofurl:exporter.outputurl]; [mpocreatempmanager sharedmanager].createdmarcopolo.fbtwittervideo = video; nslog(@"fb size (in createviewcontroller): %lu",(unsigned long)[mpocreatempmanager sharedmanager].createdmarcopolo.fbtwittervideo.length); } /*********************************** doodle *********************************************/ else if (socialsite == nil){ video = [nsdata datawithcontentsofurl:exporter.outputurl]; [mpocreatempmanager sharedmanager].createdmarcopolo.video = video; [mpocreatempmanager sharedmanager].createdmarcopolo.image = [self loadimage:exporter.outputurl]; nslog(@"*******************************doodle done*************************************"); } }]; }
Comments
Post a Comment