美文网首页
CMSampleBufferGetImageBuffer 返回

CMSampleBufferGetImageBuffer 返回

作者: 木木爱吃糖醋鱼 | 来源:发表于2018-02-22 02:52 被阅读0次

前两天被这个问题折磨的不成样子。 在stack overflow上查了一圈,基本来说总结出以下几个可能。

首先根据官方文件:

"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."

也就是说如果 CMSampleBuffer 里没有 CVImageBuffer, 或者有 CMBlockBuffer 就会返回NULL。当然出了其他错误也会返回NULL。

那其他错误都有什么可能呢?那得看你怎么取的CVImageBuffer。

比如如果是在function里这样:

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); // sampleBuffer是function提供的

NSLog(@"PixelBuffer %@",pixelBuffer);

打印出来是NULL的话。有可能是类型不对。如果sampleBuffer的类型是video或者audio的话,里面当然不会有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他的规则。比如要求设置个什么才能取出东西来,像第一个ref链接里第二个回答解释的一样。

还有一种可能。如果你跟我一样这么取 CVPixelBufferRef 的话可能会犯同样的毛病:

CMSampleBufferRef cmBuf = (CMSampleBufferRef)CFArrayGetValueAtIndex(CFMutableArrayRef, index);

CVImageBufferRef referencedImageBuffer = CMSampleBufferGetImageBuffer(cmBuf);

注意这个CFMutableArrayRef是我自己的。也就是说 CMSampleBufferRef 的来源不是某个function自带的,而是我曾经在某刻自己放进去的。

如果当时放进去的是 CVImageBufferRef 类型的话,CFArrayGetValueAtIndex 也能给取出来!这时候返回去查一下你是在哪儿放进去的,看一下那个变量的地址,再回来看看cmBuf的地址,有可能是一样的!那么从已经是 CVImageBufferRef 的 CMSampleBufferRef 变量里面再取 CVImageBufferRef,怎么可能取得出来嘛ㄟ( ▔, ▔ )ㄏ。

那么问题来了,本是CVImageBufferRef 变量为什么能declare成 CMSampleBufferRef 类型呢??因为这两个类本身就是能相互cast的。。(o_ _)ノ 恕我才疏学浅不知道为啥。看起来一个属于 core video类,一个属于core media,但是两个变量好像有继承关系。

总之取出NULL的问题多多,分水岭在于是你在取别人function的sampleBuffer,还是在取你曾经自己放进去的。

ref:

https://stackoverflow.com/questions/16861047/why-does-cmsamplebuffergetimagebuffer-return-null

https://stackoverflow.com/questions/38591957/cmsamplebuffergetimagebuffer-returning-null

相关文章

  • CMSampleBufferGetImageBuffer 返回

    前两天被这个问题折磨的不成样子。 在stack overflow上查了一圈,基本来说总结出以下几个可能。 首先根据...

  • 返回

    一大清早擺弄我的手機點擊百度,打開點擊微信,打開點擊日曆、天氣還有鹹魚 我出現在多個宇宙的街面上我看到好多扇門洞底...

  • 返回

    小水生活在一个世界,Ta的能力不断在加强,受到很多质疑,突然遇到各种阻力,Ta的公开的演讲在一幢高楼的一层,那时...

  • 返回

    终于重又回到了学校,回到了这张小而熟悉的板床。嗅着空气中略显湿润的味道,我不免得长长吁了一口气,源于北方的咳嗽应该...

  • 返回

    返回 彭瑞华 早上宝宝买好包子,边吃边往学校走。我还在早点店里吃粉。他走到学校门口后又返回到早点店里。我问他...

  • 返回

    一条渠自西向东,杨柳青青水波荡漾,风又一次跃起肩上的背囊,装着春天的悔恨无能为力,有电话来安慰和怜悯并存内心惆怅 ...

  • 返回

    这里,是我们 似曾相识的所在 岛屿与海,孤立 避风处 白鸟离天空很近,或许 象我们一样,刚刚 返回 蜜蜂的脚印 清...

  • 返回

    每周一次的看娃行程,今天以后估计会中断一段时间,又开始忙了,休假时间越长,越难以进入上班状态。 不过,即便这样还是...

  • 返回

    结束了,今年的年假结束了,不得不再次踏上返回的旅程。 每次的心情都是一样,很沉重,为过去的一年叹息,为新的一年的堪...

  • 返回

    尘间一切事 恍惚刹那间 近一个月的安吉之旅告一段落 一方水土 养一方人 好山好水好风光 地灵人杰 与安吉百姓交往之...

网友评论

      本文标题:CMSampleBufferGetImageBuffer 返回

      本文链接:https://www.haomeiwen.com/subject/hmdatftx.html