前兩天被這個(gè)問(wèn)題折磨的不成樣子。 在stack overflow上查了一圈,基本來(lái)說(shuō)總結(jié)出以下幾個(gè)可能。
首先根據(jù)官方文件:
"Result is a CVImageBuffer of media data. The result will be NULL if the CMSampleBuffer does not contain a CVImageBuffer, or if the CMSampleBuffer contains a CMBlockBuffer, or if there is some other error."
也就是說(shuō)如果?CMSampleBuffer 里沒(méi)有?CVImageBuffer, 或者有?CMBlockBuffer 就會(huì)返回NULL。當(dāng)然出了其他錯(cuò)誤也會(huì)返回NULL。
那其他錯(cuò)誤都有什么可能呢?那得看你怎么取的CVImageBuffer。
比如如果是在function里這樣:
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); // sampleBuffer是function提供的
NSLog(@"PixelBuffer %@",pixelBuffer);
打印出來(lái)是NULL的話。有可能是類型不對(duì)。如果sampleBuffer的類型是video或者audio的話,里面當(dāng)然不會(huì)有CVPixelBuffer了。那么檢查一下type就可以了:
? ? CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
? ? CMFormatDescriptionRef formatDesc = CMSampleBufferGetFormatDescription(sampleBuffer);
? ? CMMediaType mediaType = CMFormatDescriptionGetMediaType(formatDesc);
? ? //Checking sample type before proceeding
? ? if (mediaType == kCMMediaType_Audio){
? ? ? ? return;
? ? }else{
? ? ? ? // do your work
? ? }
如果是其他的什么function,就要follow他的規(guī)則。比如要求設(shè)置個(gè)什么才能取出東西來(lái),像第一個(gè)ref鏈接里第二個(gè)回答解釋的一樣。
還有一種可能。如果你跟我一樣這么取?CVPixelBufferRef 的話可能會(huì)犯同樣的毛?。?/p>
CMSampleBufferRef cmBuf =?(CMSampleBufferRef)CFArrayGetValueAtIndex(CFMutableArrayRef, index);
CVImageBufferRef referencedImageBuffer = CMSampleBufferGetImageBuffer(cmBuf);
注意這個(gè)CFMutableArrayRef是我自己的。也就是說(shuō)?CMSampleBufferRef 的來(lái)源不是某個(gè)function自帶的,而是我曾經(jīng)在某刻自己放進(jìn)去的。
如果當(dāng)時(shí)放進(jìn)去的是?CVImageBufferRef 類型的話,CFArrayGetValueAtIndex 也能給取出來(lái)!這時(shí)候返回去查一下你是在哪兒放進(jìn)去的,看一下那個(gè)變量的地址,再回來(lái)看看cmBuf的地址,有可能是一樣的!那么從已經(jīng)是?CVImageBufferRef 的?CMSampleBufferRef 變量里面再取?CVImageBufferRef,怎么可能取得出來(lái)嘛ㄟ( ▔, ▔ )ㄏ。
那么問(wèn)題來(lái)了,本是CVImageBufferRef?變量為什么能declare成?CMSampleBufferRef 類型呢??因?yàn)檫@兩個(gè)類本身就是能相互cast的。。(o_ _)? 恕我才疏學(xué)淺不知道為啥。看起來(lái)一個(gè)屬于 core video類,一個(gè)屬于core media,但是兩個(gè)變量好像有繼承關(guān)系。
總之取出NULL的問(wèn)題多多,分水嶺在于是你在取別人function的sampleBuffer,還是在取你曾經(jīng)自己放進(jìn)去的。
ref:
https://stackoverflow.com/questions/16861047/why-does-cmsamplebuffergetimagebuffer-return-null
https://stackoverflow.com/questions/38591957/cmsamplebuffergetimagebuffer-returning-null