Tag: cmsamplebuffer

设置AVSampleBufferDisplayLayer呈现样本缓冲区的速率

我正在使用AVSampleBufferDisplayLayer来显示通过h.264格式的networking连接来的CMSampleBuffers。 video播放是顺利和正常工作,但我似乎无法控制帧速率。 特别是,如果我在AVSampleBufferDisplayLayer中每秒排列60帧,即使video以30 FPSlogging,它也会显示这60帧。 创build样本缓冲区时,可以通过向CMSampleBufferCreate传递一个时间信息数组来设置表示时间戳(时间信息不在h.264stream中,但可以通过容器格式进行计算或传递)。 我设置的演示时间戳大约相隔0.033秒,持续时间为0.033,但显示层仍然每秒显示尽可能多的帧数。 有两种方法可以在AVSampleBufferDisplayLayer上排队缓冲区:通过在缓冲区就绪时调用[AVSampleBufferDisplayLayer enqueueSampleBuffer:],或通过调用[AVSampleBufferDisplayLayer requestMediaDataWhenReadyOnQueue:usingBlock:]并使该块中的缓冲区排入队列,来“约束”缓冲区。 我已经尝试了两个,但即使第二个方法尽可能快地显示缓冲区 – 例如,如果我有300帧在接收端排队,那么上面的方法中的块第一次执行readyForMoreMediaData保持真实无论多less缓冲区会被排队,并且它们都会在很短的时间内显示出来。 如果在CMSampleBuffer上设置了kCMSampleAttachmentKey_DisplayImmediately附件,则此行为与预期的行为类似,但目前未设置(默认值为false)。 我试图设置图层controlTimeBase,但它似乎没有任何效果。 我在其他东西的损失尝试,无法find网上的例子。 有谁知道如何控制AVSampleBufferDisplayLayer显示帧的帧率?

从CMSampleBuffer提取数据以创build深层副本

我正在尝试创build一个由AVCaptureVideoDataOutputSampleBufferDelegate中的captureOutput返回的CMSampleBuffer的副本。 由于CMSampleBuffers来自预先分配的(15)缓冲池,如果我附加一个对它们的引用,它们不能被重新收集。 这会导致所有剩余的帧被丢弃。 为了保持最佳性能,一些样本缓冲区直接引用可能需要由设备系统和其他捕获input重用的内存池。 对于未压缩的设备本机捕获而言,这种情况经常是这样的,即尽可能less地复制存储器块。 如果多个采样缓冲区参考这样的内存池的时间太长,input将不再能够将新的采样拷贝到内存中,并且这些采样将被丢弃。 如果您的应用程序因保留提供的CMSampleBufferRef对象太长而导致样本丢失,但需要长时间访问样本数据,请考虑将数据复制到新缓冲区,然后释放样本缓冲区(如果它以前保留),以便它所引用的内存可以被重用。 显然我必须复制CMSampleBuffer,但CMSampleBufferCreateCopy()只会创build一个浅拷贝。 因此我得出结论,我必须使用CMSampleBufferCreate()。 我填了12个! 参数构造函数需要但遇到了我的CMSampleBuffers不包含blockBuffer(不完全确定是什么,但似乎很重要)的问题。 这个问题已经被问了好几次,但没有回答。 CMImageBuffer或CVImageBuffer的深度拷贝和在Swift 2.0中创build一个CMSampleBuffer的副本 一个可能的答案是“我终于想出了如何使用这个来创build一个深度克隆,所有的复制方法都重复使用了堆中的数据,这些数据会lockingAVCaptureSession,所以我不得不把数据拉出到一个NSMutableData对象中,然后创build了一个新的样本缓冲区。“ 信贷给罗布 。 但是,我不知道如何正确地做到这一点。 如果你有兴趣, 这是print(sampleBuffer)的输出。 没有提到blockBuffer,又名CMSampleBufferGetDataBuffer返回nil。 有一个imageBuffer,但使用CMSampleBufferCreateForImageBuffer创build一个“复制”似乎并没有释放CMSampleBuffer。 编辑:由于这个问题已经发布,我一直在尝试更多的方式来复制内存。 我做了同样的事情,用户Kametrixom尝试。 这是我的想法,首先复制CVPixelBuffer,然后使用CMSampleBufferCreateForImageBuffer来创build最终的示例缓冲区。 但是这会导致两个错误之一: memcpy指令中的EXC_BAD_ACCESS。 AKA尝试访问应用程序内存之外的段错误。 或者,内存将成功复制,但CMSampleBufferCreateReadyWithImageBuffer()将失败,并显示结果代码“12743”,表示给定介质的格式与给定的格式描述不匹配。例如,与CVImageBuffer配对的格式描述与CMVideoFormatDescriptionMatchesImageBuffer “。 您可以看到Kametrixom和我都使用CMSampleBufferGetFormatDescription(sampleBuffer)来尝试复制源缓冲区的格式描述。 因此,我不知道为什么给定媒体的格式不符合给定的格式描述。