objective c - How to set preferredTransform to exported video with AVAssetExportSession -


i trying export video same rotation transform camera does. example, film video with1920x1080 resolution(landscape) cgaffinetransform(0, -1, 1, 0, 1080, 0). after work want export video same naturalsize , preferredtransform original video, exportsession rotating video. code below transform original video portrait mode portrait rotation, not want achieve.

any idea? in advance.

- (void)applydrawwithcompletion:(void(^)(nsurl *))completion {   //setup video asset layer   avurlasset* videoasset = (avurlasset *)self.avplayer.currentitem.asset;   avmutablecomposition* mixcomposition = [avmutablecomposition composition];    avmutablecompositiontrack *compositionvideotrack = [mixcomposition addmutabletrackwithmediatype:avmediatypevideo  preferredtrackid:kcmpersistenttrackid_invalid];   avassettrack *clipvideotrack = [[videoasset trackswithmediatype:avmediatypevideo] objectatindex:0];    [compositionvideotrack inserttimerange:cmtimerangemake(kcmtimezero, videoasset.duration)                                  oftrack:clipvideotrack                                   attime:kcmtimezero error:nil];   avmutablecompositiontrack *compositionaudiotrack = [mixcomposition addmutabletrackwithmediatype:avmediatypeaudio preferredtrackid:kcmpersistenttrackid_invalid];   avassettrack *clipaudiotrack = [videoasset trackswithmediatype:avmediatypeaudio][0];   [compositionaudiotrack inserttimerange:cmtimerangemake(kcmtimezero, [mixcomposition duration]) oftrack:clipaudiotrack attime:kcmtimezero error:nil];    [compositionvideotrack setpreferredtransform:clipvideotrack.preferredtransform];    //new layer draw image   cgsize videosize = cgsizemake(clipvideotrack.naturalsize.height, clipvideotrack.naturalsize.width);   calayer *drawlayer = [calayer layer];   drawlayer.contents = (id)self.tempdrawimage.image.cgimage;   drawlayer.frame = cgrectmake(0, 0, videosize.width, videosize.height);    //proper sorting of video layers   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:videolayer];   [parentlayer addsublayer:drawlayer];    avmutablevideocomposition* videocomp = [avmutablevideocomposition videocomposition];   videocomp.rendersize = videosize;   videocomp.frameduration = cmtimemake(1, 30);   videocomp.animationtool = [avvideocompositioncoreanimationtool videocompositioncoreanimationtoolwithpostprocessingasvideolayer:videolayer inlayer:parentlayer];    //adding layer along asset duration   avmutablevideocompositioninstruction *instruction = [avmutablevideocompositioninstruction videocompositioninstruction];   instruction.timerange = cmtimerangemake(kcmtimezero, [mixcomposition duration]);    avassettrack *videotrack = [[mixcomposition trackswithmediatype:avmediatypevideo] objectatindex:0];   avmutablevideocompositionlayerinstruction* layerinstruction = [avmutablevideocompositionlayerinstruction videocompositionlayerinstructionwithassettrack:videotrack];   //apply transform layer instructions   [layerinstruction settransform:clipvideotrack.preferredtransform attime:kcmtimezero];    instruction.layerinstructions = [nsarray arraywithobject:layerinstruction];   videocomp.instructions = [nsarray arraywithobject: instruction];    //export edited video   avassetexportsession *assetexport = [[avassetexportsession alloc] initwithasset:mixcomposition presetname:avassetexportpresethighestquality];   assetexport.videocomposition = videocomp;    nsstring *exportpath = [nstemporarydirectory() stringbyappendingpathcomponent:@"editedvideo.mov"];;    if ([[nsfilemanager defaultmanager] fileexistsatpath:exportpath]) {     [[nsfilemanager defaultmanager] removeitematpath:exportpath error:nil];   }    assetexport.outputfiletype = avfiletypequicktimemovie;   assetexport.outputurl = [nsurl fileurlwithpath:exportpath];   assetexport.shouldoptimizefornetworkuse = yes;    [assetexport exportasynchronouslywithcompletionhandler:^(void) {     if (assetexport.status == avassetexportsessionstatuscompleted) {       completion(assetexport.outputurl);     }else if(assetexport.status == avassetexportsessionstatusfailed || assetexport.status == avassetexportsessionstatuscancelled){       completion(nil);     }   }]; } 

i processed original camera video same method , add following code:

cgaffinetransform t = clipvideotrack.preferredtransform;   bool  isportrait = (t.a == 0 && t.b == 1.0 && t.c == -1.0 && t.d == 0) || (t.a == 0 && t.b == -1.0 && t.c == 1.0 && t.d == 0);    //new layer draw image   cgsize videosize = clipvideotrack.naturalsize;   if (isportrait) {     videosize = cgsizemake(clipvideotrack.naturalsize.height, clipvideotrack.naturalsize.width);   } 

this changed landscape video portrait same transform other edited , processed videos. not looking for, solve problem. if know how achieve original question goal please feel free add answer.


Comments

Popular posts from this blog

ruby - Trying to change last to "x"s to 23 -

jquery - Clone last and append item to closest class -

c - Unrecognised emulation mode: elf_i386 on MinGW32 -