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

Capture and play voice with Asterisk ARI -

java - Why database contraints in HSQLDB are only checked during a commit when using transactions in Hibernate? -

visual studio - Installing Packages through Nuget - "Central Directory corrupt" -