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
Post a Comment