(CMSampleBufferRef)sampleBuffer
// 這里的sampleBuffer就是采集到的數(shù)據(jù)了,但它是Video還是Audio的數(shù)據(jù),得根據(jù)connection來(lái)判斷
如果把要從采集的數(shù)據(jù)中拿到視頻數(shù)據(jù)呢?
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
int width = CVPixelBufferGetWidth(pixelBuffer);
int height = CVPixelBufferGetHeight(pixelBuffer);
所以,CMSampleBufferRef和CVPixelBufferRef的關(guān)系就知道了
再看一篇文章就更清楚了
在iOS里,我們經(jīng)常能看到 CVPixelBufferRef 這個(gè)類型,在Camera 采集返回的數(shù)據(jù)里得到一個(gè)CMSampleBufferRef,而每個(gè)CMSampleBufferRef里則包含一個(gè) CVPixelBufferRef,在視頻硬解碼的返回?cái)?shù)據(jù)里也是一個(gè) CVPixelBufferRef。
顧名思義,CVPixelBufferRef 是一種像素圖片類型,由于CV開(kāi)頭,所以它是屬于 CoreVideo 模塊的。
CVPixelBufferRef是可以轉(zhuǎn)換成一個(gè) openGL texture的,方法如下:
CVOpenGLESTextureRef pixelBufferTexture;
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
_textureCache,
pixelBuffer,
NULL,
GL_TEXTURE_2D,
GL_RGBA,
width,
height,
GL_BGRA,
GL_UNSIGNED_BYTE,
0,
&pixelBufferTexture);
其中,_textureCache 代表一個(gè) Texture緩存,每次生產(chǎn)的Texture都是從緩存獲取的,這樣可以省掉反復(fù)創(chuàng)建Texture的開(kāi)銷,_textureCache要實(shí)現(xiàn)創(chuàng)建好,創(chuàng)建方法如下
CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, _context, NULL, &_textureCache);