iphone - How to Add sound to created Video From Images -
this code using creating video images further need put soundtrack video..any appriciated.
- (ibaction)savemovietolibrary { imagevideopath = [nshomedirectory() stringbyappendingpathcomponent:[nsstring stringwithformat:@"documents/movie.mp4"]]; nslog(@"<><><><>=%@",imagevideopath); testimagearray = [[nsarray alloc] initwithobjects: [uiimage imagenamed:@"image1.png"], [uiimage imagenamed:@"image2.png"], [uiimage imagenamed:@"image3.png"], [uiimage imagenamed:@"image4.png"], [uiimage imagenamed:@"image5.png"], [uiimage imagenamed:@"image6.png"], [uiimage imagenamed:@"image7.png"], [uiimage imagenamed:@"image9.png"], [uiimage imagenamed:@"image10.png"], [uiimage imagenamed:@"image11.png"], [uiimage imagenamed:@"image12.png"], nil]; // nslog(@"testimagearray/=%@",testimagearray); [self writeimageasmovie:testimagearray topath:imagevideopath size:cgsizemake(480, 320) duration:1]; } -(void)writeimageasmovie:(nsarray *)array topath:(nsstring*)path size:(cgsize)size duration:(int)duration { nserror *error = nil; avassetwriter *videowriter = [[avassetwriter alloc] initwithurl:[nsurl fileurlwithpath:path] filetype:avfiletypempeg4 error:&error]; nsparameterassert(videowriter); nsdictionary *videosettings = [nsdictionary dictionarywithobjectsandkeys: avvideocodech264, avvideocodeckey, [nsnumber numberwithint:size.width], avvideowidthkey, [nsnumber numberwithint:size.height], avvideoheightkey, nil]; avassetwriterinput* writerinput = [[avassetwriterinput assetwriterinputwithmediatype:avmediatypevideo outputsettings:videosettings] retain]; avassetwriterinputpixelbufferadaptor *adaptor = [avassetwriterinputpixelbufferadaptor assetwriterinputpixelbufferadaptorwithassetwriterinput:writerinput sourcepixelbufferattributes:nil]; nsparameterassert(writerinput); nsparameterassert([videowriter canaddinput:writerinput]); [videowriter addinput:writerinput]; //start session: [videowriter startwriting]; [videowriter startsessionatsourcetime:kcmtimezero]; cvpixelbufferref buffer = null; buffer = [self pixelbufferfromcgimage:[[array objectatindex:0] cgimage] size:cgsizemake(480, 320)]; cvpixelbufferpoolcreatepixelbuffer (null, adaptor.pixelbufferpool, &buffer); [adaptor appendpixelbuffer:buffer withpresentationtime:kcmtimezero]; int = 1; while (1) { if(writerinput.readyformoremediadata){ cmtime frametime = cmtimemake( 0, 12); cmtime lasttime=cmtimemake(i, 2); cmtime presenttime=cmtimeadd(lasttime, frametime); if (i >= [array count]) { buffer = null; } else { buffer = [self pixelbufferfromcgimage:[[array objectatindex:i] cgimage] size:cgsizemake(480, 320)]; } if (buffer) { // append buffer [adaptor appendpixelbuffer:buffer withpresentationtime:presenttime]; i++; } else { //finish session: [writerinput markasfinished]; [videowriter finishwriting]; cvpixelbufferpoolrelease(adaptor.pixelbufferpool); [videowriter release]; [writerinput release]; nslog (@"done"); break; } } } audiofilepath1=[[nsbundle mainbundle]pathforresource:@"video" oftype:@"mp3"]; nslog(@"%@",audiofilepath1); nslog(@"video file path=%@",imagevideopath); [self addaudiotofileatpath:imagevideopath andaudiopath:audiofilepath1]; } - (cvpixelbufferref) pixelbufferfromcgimage: (cgimageref) image size:(cgsize) size{ nsdictionary *options = [nsdictionary dictionarywithobjectsandkeys: [nsnumber numberwithbool:yes], kcvpixelbuffercgimagecompatibilitykey, [nsnumber numberwithbool:yes], kcvpixelbuffercgbitmapcontextcompatibilitykey, nil]; cvpixelbufferref pxbuffer = null; cvreturn status = cvpixelbuffercreate(kcfallocatordefault, size.width, size.height, kcvpixelformattype_32argb, (cfdictionaryref) options, &pxbuffer); nsparameterassert(status == kcvreturnsuccess && pxbuffer != null); cvpixelbufferlockbaseaddress(pxbuffer, 0); void *pxdata = cvpixelbuffergetbaseaddress(pxbuffer); nsparameterassert(pxdata != null); cgcolorspaceref rgbcolorspace = cgcolorspacecreatedevicergb(); cgcontextref context = cgbitmapcontextcreate(pxdata, size.width, size.height, 8, 4*size.width, rgbcolorspace, kcgimagealphanoneskipfirst); nsparameterassert(context); cgcontextconcatctm(context, cgaffinetransformmakerotation(0)); cgcontextdrawimage(context, cgrectmake(0, 0, cgimagegetwidth(image), cgimagegetheight(image)), image); cgcolorspacerelease(rgbcolorspace); cgcontextrelease(context); cvpixelbufferunlockbaseaddress(pxbuffer, 0); return pxbuffer; }
use code:
avurlasset* audioasset = [[avurlasset alloc]initwithurl:audiourl options:nil]; avurlasset* videoasset = [[avurlasset alloc]initwithurl:videourl options:nil]; avmutablecomposition* mixcomposition = [avmutablecomposition composition]; avmutablecompositiontrack *compositioncommentarytrack = [mixcomposition addmutabletrackwithmediatype:avmediatypeaudio preferredtrackid:kcmpersistenttrackid_invalid]; [compositioncommentarytrack inserttimerange:cmtimerangemake(kcmtimezero, audioasset.duration) oftrack:[[audioasset trackswithmediatype:avmediatypeaudio] objectatindex:0] attime:kcmtimezero error:nil]; avmutablecompositiontrack *compositionvideotrack = [mixcomposition addmutabletrackwithmediatype:avmediatypevideo preferredtrackid:kcmpersistenttrackid_invalid]; [compositionvideotrack inserttimerange:cmtimerangemake(kcmtimezero, videoasset.duration) oftrack:[[videoasset trackswithmediatype:avmediatypevideo] objectatindex:0] attime:kcmtimezero error:nil]; avassetexportsession* _assetexport = [[avassetexportsession alloc] initwithasset:mixcomposition presetname:avassetexportpresetpassthrough]; nsstring* videoname = @"export.mov"; nsstring *exportpath = [nstemporarydirectory() stringbyappendingpathcomponent:videoname]; nsurl *exporturl = [nsurl fileurlwithpath:exportpath]; //url of video created image if ([[nsfilemanager defaultmanager] fileexistsatpath:exportpath]) { [[nsfilemanager defaultmanager] removeitematpath:exportpath error:nil]; } _assetexport.outputfiletype = @"com.apple.quicktime-movie"; dlog(@"file type %@",_assetexport.outputfiletype); _assetexport.outputurl = exporturl; _assetexport.shouldoptimizefornetworkuse = yes; [_assetexport exportasynchronouslywithcompletionhandler: ^(void ) { // completion code here } } ]; hope useful.
Comments
Post a Comment