iphone - Convert UIImage to CMSampleBufferRef -


i doing video recording using avfoundation. have crop video 320x280. getting cmsamplebufferref , converting uiimage using below code.

cgimageref _cgimage = [self imagefromsamplebuffer:samplebuffer]; uiimage *_uiimage = [uiimage imagewithcgimage:_cgimage]; cgimagerelease(_cgimage); _uiimage = [_uiimage resizedimagewithsize:cgsizemake(320, 280)];  cmsamplebufferref croppedbuffer = /* need */  [_videoinput appendsamplebuffer:samplebuffer];  // _videoinput avassetwriterinput 

the imagefromsamplebuffer: method looks this:

- (cgimageref) imagefromsamplebuffer:(cmsamplebufferref) samplebuffer // create cgimageref sample buffer data {     cvimagebufferref imagebuffer = cmsamplebuffergetimagebuffer(samplebuffer);     cvpixelbufferlockbaseaddress(imagebuffer,0);        // lock image buffer      uint8_t *baseaddress = (uint8_t *)cvpixelbuffergetbaseaddressofplane(imagebuffer, 0);   // information of image     size_t bytesperrow = cvpixelbuffergetbytesperrow(imagebuffer);     size_t width = cvpixelbuffergetwidth(imagebuffer);     size_t height = cvpixelbuffergetheight(imagebuffer);     cgcolorspaceref colorspace = cgcolorspacecreatedevicergb();      cgcontextref newcontext = cgbitmapcontextcreate(baseaddress, width, height, 8, bytesperrow, colorspace, kcgbitmapbyteorder32little | kcgimagealphapremultipliedfirst);     cgimageref newimage = cgbitmapcontextcreateimage(newcontext);     cgcontextrelease(newcontext);      cgcolorspacerelease(colorspace);     cvpixelbufferunlockbaseaddress(imagebuffer,0);     /* cvbufferrelease(imagebuffer); */  // not call this!      return newimage; } 

now have convert resized image cmsamplebufferref write in avassetwriterinput.

how convert uiimage cmsamplebufferref?

thanks everyone!

while create own core media sample buffers scratch, it's easier use avpixelbufferadaptor.

you describe source pixel buffer format in inputsettings dictionary , pass adaptor initializer:

nsmutabledictionary* inputsettingsdict = [nsmutabledictionary dictionary]; [inputsettingsdict setobject:[nsnumber numberwithint:pixelformat] forkey:(nsstring*)kcvpixelbufferpixelformattypekey]; [inputsettingsdict setobject:[nsnumber numberwithunsignedinteger:(nsuinteger)(image.uncompressedsize/image.rect.size.height)] forkey:(nsstring*)kcvpixelbufferbytesperrowalignmentkey]; [inputsettingsdict setobject:[nsnumber numberwithdouble:image.rect.size.width] forkey:(nsstring*)kcvpixelbufferwidthkey]; [inputsettingsdict setobject:[nsnumber numberwithdouble:image.rect.size.height] forkey:(nsstring*)kcvpixelbufferheightkey]; [inputsettingsdict setobject:[nsnumber numberwithbool:yes] forkey:(nsstring*)kcvpixelbuffercgimagecompatibilitykey]; [inputsettingsdict setobject:[nsnumber numberwithbool:yes] forkey:(nsstring*)kcvpixelbuffercgbitmapcontextcompatibilitykey]; avassetwriterinputpixelbufferadaptor* pixelbufferadapter = [[avassetwriterinputpixelbufferadaptor alloc] initwithassetwriterinput:assetwriterinput sourcepixelbufferattributes:inputsettingsdict]; 

you can append cvpixelbuffers adaptor:

[pixelbufferadapter appendpixelbuffer:completepixelbuffer withpresentationtime:pixelbuffertime] 

the pixelbufferadaptor accepts cvpixelbuffers, have convert uiimages pixelbuffers, described here: https://stackoverflow.com/a/3742212/100848
pass cgimage property of uiimage newpixelbufferfromcgimage.


Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -