Black Video CAAnimation and AVFoundation AVAssetExportSession -
i'm relative newbie on whole avfoundation video editing circuit.
my current test app 2 screen application, first screen avfoundation video recording (1.mov), , second screen lets view video , put title credits on caanimation.
the 1.mov video file recorded in portrait saved disk , run though routine should give me title on top of video. black video of right dimensions, time length catextlayer on it.
i'm pretty sure i'm missing basic. have code in place should handle whole landscape portrait rotation.
-(ibaction)composemovie:(id)sender { nslog (@"composemovie"); calayer *alayer = [calayer layer]; alayer.frame = cgrectmake(0, 0, videosize.height, videosize.width); calayer *blayer = [calayer layer]; nslog(@"create title"); catextlayer *titlelayer = [catextlayer layer]; titlelayer.string = @"sudo make me sandwich"; titlelayer.font = [uifont boldsystemfontofsize:18].fontname; titlelayer.backgroundcolor = [uicolor whitecolor].cgcolor; titlelayer.foregroundcolor = [uicolor blackcolor].cgcolor; titlelayer.fontsize = 24; titlelayer.alignmentmode = kcaalignmentright; titlelayer.bounds = cgrectmake(videosize.width, videosize.height /6, 300, 32); [alayer addsublayer:titlelayer]; nsurl *url = [nsurl fileurlwithpath:getcapturemoviepath()]; //hard coded path 1.mov file in documents directory avurlasset *asset = [avurlasset urlassetwithurl:url options:nil]; avmutablecomposition *cmp = [[avmutablecomposition alloc] init] ; avmutablecompositiontrack *tracka = [cmp addmutabletrackwithmediatype:avmediatypevideo preferredtrackid:kcmpersistenttrackid_invalid]; nserror *error = nil ; avassettrack *sourcevideotrack = [[asset trackswithmediatype:avmediatypevideo] objectatindex:0]; [tracka inserttimerange:cmtimerangemake(kcmtimezero, [asset duration]) oftrack:sourcevideotrack attime:kcmtimezero error:&error] ; avmutablevideocomposition *animcomp = [[avmutablevideocomposition videocomposition] retain]; animcomp.rendersize = cgsizemake(videosize.height, videosize.width); animcomp.frameduration = cmtimemake(1,30); avmutablevideocompositioninstruction *instruction = [avmutablevideocompositioninstruction videocompositioninstruction]; instruction.timerange = cmtimerangemake(kcmtimezero, cmtimemakewithseconds(60, 30) ); avmutablevideocompositionlayerinstruction* rotator = [avmutablevideocompositionlayerinstruction videocompositionlayerinstructionwithassettrack:[[asset trackswithmediatype:avmediatypevideo] objectatindex:0]]; cgaffinetransform translatetocenter = cgaffinetransformmaketranslation( 0,-320); cgaffinetransform rotateby90degrees = cgaffinetransformmakerotation( m_pi_2); cgaffinetransform shrinkwidth = cgaffinetransformmakescale(0.66, 1); // needed because apple "stretch" default - really, should find , undo apple's stretch - suspect it'll calayer defaulttransform, or uiview property causing cgaffinetransform finaltransform = cgaffinetransformconcat( shrinkwidth, cgaffinetransformconcat(translatetocenter, rotateby90degrees) ); [rotator settransform:finaltransform attime:kcmtimezero]; instruction.layerinstructions = [nsarray arraywithobject: rotator]; animcomp.instructions = [nsarray arraywithobject: instruction]; nslog(@"creating animation"); //animcomp.animationtool = [avvideocompositioncoreanimationtool videocompositioncoreanimationtoolwithadditionallayer: astrackid:1]; animcomp.animationtool = [avvideocompositioncoreanimationtool videocompositioncoreanimationtoolwithadditionallayer:alayer astrackid:2]; animcomp.animationtool = [avvideocompositioncoreanimationtool videocompositioncoreanimationtoolwithadditionallayer:blayer astrackid:3]; //avmutablevideocompositioninstruction *instruction = [avmutablevideocompositioninstruction videocompositioninstruction]; instruction.timerange = cmtimerangemake(kcmtimezero, [asset duration]); avmutablevideocompositionlayerinstruction* layerinstruction = [avmutablevideocompositionlayerinstruction videocompositionlayerinstructionwithassettrack:tracka]; //[layerinstruction settrackid:1]; /*cmtime starttime = cmtimemake(3,1); cmtime stoptime = cmtimemake(5,1); cmtimerange exporttimerange = cmtimerangefromtimetotime(starttime, stoptime); */ //avmutablevideocompositionlayerinstruction *passthroughlayer = avmutablevideocompositionlayerinstruction videocompositionlayerinstructionwithassettrack:videotrack]; cgaffinetransform rotationtransform = cgaffinetransformmakerotation(degreestoradians(90.0)); cgaffinetransform rotatetranslate = cgaffinetransformtranslate(rotationtransform,320,0); [layerinstruction settransform:rotatetranslate attime:kcmtimezero]; [layerinstruction setopacity:1.0 attime:kcmtimezero ]; instruction.layerinstructions = [nsarray arraywithobject:layerinstruction]; animcomp.instructions = [nsarray arraywithobject:instruction]; calayer *parentlayer = [calayer layer]; calayer *videolayer = [calayer layer]; parentlayer.frame = cgrectmake(0,0, videosize.width, videosize.height); videolayer.frame = cgrectmake(0,0, videosize.width, videosize.height); [parentlayer addsublayer:alayer]; [parentlayer addsublayer:blayer]; [parentlayer addsublayer:videolayer]; animcomp.animationtool = [avvideocompositioncoreanimationtool videocompositioncoreanimationtoolwithpostprocessingasvideolayer:videolayer inlayer:parentlayer]; nslog(@"creating file"); nsarray *docpaths = nssearchpathfordirectoriesindomains(nsdocumentdirectory, nsuserdomainmask, yes); nsstring *temppath = [docpaths objectatindex:0]; nslog(@"temp path: %@",temppath); nsstring *filename = [nsstring stringwithformat:@"%@/render.mov",temppath]; nsfilemanager *filemanager = [nsfilemanager defaultmanager] ; if([filemanager fileexistsatpath:filename ]){ nserror *ferror = nil ; bool success = [filemanager removeitematpath:filename error:&ferror]; } nsurl *exporturl = [nsurl fileurlwithpath:filename]; avassetexportsession *exporter = [[avassetexportsession alloc] initwithasset:cmp presetname:avassetexportpresethighestquality] ; exporter.outputurl = exporturl; exporter.videocomposition = animcomp ; exporter.outputfiletype= avfiletypequicktimemovie ; [exporter exportasynchronouslywithcompletionhandler:^(void){ switch (exporter.status) { case avassetexportsessionstatusfailed:{ nslog(@"fail"); break; } case avassetexportsessionstatuscompleted:{ nslog(@"success"); break; } default: break; } }]; nslog(@"end composemovie"); }
the problem following lines.
parentlayer.frame = cgrectmake(0,0, videosize.width, videosize.height); videolayer.frame = cgrectmake(0,0, videosize.width, videosize.height); changing videosize.width 320, , videosize.height = 480 fixed issue.
Comments
Post a Comment