CMSampleBufferGetImageBuffer 返回 NULL?

前兩天被這個(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,643評(píng)論 18 399
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡(jiǎn)單...
    舟漁行舟閱讀 8,118評(píng)論 2 17
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,246評(píng)論 0 38
  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,541評(píng)論 0 13
  • 作者:第十六組-----張曉君 刁夢(mèng)雅 王璇 案例名稱:中斷 科目:Mixly 教學(xué)對(duì)象:四年級(jí)學(xué)生 課時(shí):90分...
    0138_王璇閱讀 3,074評(píng)論 0 1

友情鏈接更多精彩內(nèi)容