问题标签 [cmsamplebufferref]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3116 浏览

ios - 从 CMSampleBufferRef 创建 UIImage 时 iOS 内存增加

我正在从's创建UIImage对象。CMSampleBufferRef我在一个单独的队列中(在后台)执行此操作,因此我将处理包含在一个@autorealease池中。问题是内存正在积累而没有任何泄漏通知。贝娄是我正在使用的方法:

这就是我使用它的方式:

0 投票
1 回答
3050 浏览

ios - 为什么 AVSampleBufferDisplayLayer 停止显示取自 AVCaptureVideoDataOutput 委托的 CMSampleBuffers?

我想用 AVSampleBufferDisplayLayer 显示一些 CMSampleBuffer,但在显示第一个样本后它会冻结。

我从 AVCaptureVideoDataOutputSampleBuffer 委托中获取样本缓冲区:

将它们放入向量中

然后尝试通过 AVSampleBufferDisplayLayer 显示它们(在另一个 ViewController 中)

但它显示第一个样本然后冻结,并且什么都不做。

而我的视频数据输出设置如下:

0 投票
1 回答
1565 浏览

ios - AVSampleBufferDisplayLayer 中的视频流未显示在屏幕截图中

我一直在使用新的 Video Toolbox 方法来获取 H.264 视频流并使用AVSampleBufferDisplayLayer. 这一切都按预期工作,流看起来很棒。 但是,当我尝试截取整个视图的屏幕截图时,AVSampleBufferDisplayLayer(即解压缩的视频流)的内容不会显示在快照中。 快照显示所有其他 UI 按钮/标签/等。但屏幕截图只显示了AVSampleBufferDisplayLayer(我设置为亮蓝色)的背景颜色,而不是实时视频源。

在下面的方法中(受这篇文章的启发),我SampleBuffer从我的流中取出并排队以显示在AVSampleBufferDisplayLayer. 然后我调用我的方法imageFromLayer:将快照作为UIImage. (然后,我要么在UIImageView imageDisplay中显示该 UIImage ,要么将其保存到设备的本地相机胶卷中以验证其UIImage外观。两种方法产生相同的结果。)

在这里,我只是简单地获取 的内容AVSampleBufferDisplayLayer并尝试将其转换为UIImage. 如果我将整个屏幕作为图层传递给此方法,则所有其他 UI 元素(如标签/按钮/图像)都将显示,除了AVDisplayLayer. 如果我只传入AVDisplayLayer,我会得到一个纯蓝色图像(因为背景颜色是蓝色)。

我试过使用UIImage snapshot = [self imageFromLayer: self.AVSampleDisplayLayer.presentationLayer]; and .modelLayer,但这没有帮助。我尝试过将采样缓冲区排队并在拍摄快照之前等待,我尝试过弄乱 的不透明度和 xPosition AVDisplayLayer...我什至尝试CMTimebaseAVDisplayLayer. 任何提示表示赞赏!

同样根据这篇文章这篇文章,其他人在 iOS 8 中也遇到了类似的快照问题。

0 投票
1 回答
6754 浏览

ios - 如何从 iOS 中的 CMSampleBufferRef 获取当前捕获的相机数据时间戳

我开发了一个 iOS 应用程序,它将捕获的相机数据保存到一个文件中,我使用了

捕获 CMSampleBufferRef 并将其编码为 H264 格式,并且帧将使用AVAssetWriter.

我按照示例源代码创建了这个应用程序:

现在我想获取保存的视频帧的时间戳来创建一个新的电影文件。为此,我做了以下事情

  1. 找到文件并创建AVAssestReader以读取文件

打印的值给了我一个错误的时间戳,我需要获取帧的捕获时间。

有什么方法可以获取帧捕获时间戳?

我已经阅读了一个答案以使其具有时间戳,但它没有正确阐述我上面的问题。

更新:

我在写入文件之前读取了示例时间戳,它给了我xxxxx价值(33333.23232)。在我尝试读取文件后,它给了我不同的价值。这有什么具体原因吗??

0 投票
1 回答
2715 浏览

swift - 使用准确的 CMTime 将 AudioBuffer 转换为 CMSampleBuffer

这里的目标是通过 AVCaptureDataOutput 的视频和录制 CoreAudio 的音频创建一个 mp4 文件。然后将两者的 CMSampleBuffers 发送到具有随附 AVAssetWriterInput(AVMediaTypeVideo) 和 AVAssetWriterInput(AVMediaTypeAudio) 的 AVAssetWriter

我的音频编码器将 AudioBuffer 复制到新的 CMSampleBuffer 并将其传递给 AVAssetWriterInput(AVMediaTypeAudio)。这个例子是如何完成 AudioBuffer 到 CMSampleBuffer 的转换。转换为 CMSampleBuffer

长话短说,它不起作用。视频显示但没有音频。

但是,如果我注释掉视频编码,那么音频就会被写入文件并且可以听到。

这从经验告诉我这是一个时间问题。到 CMSampleBuffer的转换确实显示

它产生一个时间 CMTimeCopyDescription ,{0/1 = 0.000} 这对我来说似乎完全错误。我尝试跟踪渲染的帧并传递时间值的帧数和时间尺度的采样率,如下所示

但没有骰子。更好看的 CMSampleTimingInfo {107520/44100 = 2.438},但文件中仍然没有音频。

视频 CMSampleBuffer 会产生类似这样的内容{65792640630624/1000000000 = 65792.641, rounded}。这告诉我 AVCaptureVideoOutput 的时间尺度为 10 亿,可能是纳秒。我来宾时间值是设备时间之类的东西。我找不到任何关于 AVCaptureVideoOutput 使用的信息。

有人有任何有用的指导吗?我什至走在正确的轨道上吗?

这是转换

还有我创建的assetWriters

0 投票
2 回答
726 浏览

ios - 从 .mov 文件创建 `CMSampleBufferRef`

我的应用程序捕获了一个 3 秒的视频剪辑,并且以编程方式我想通过循环 5 次从录制的 3 秒剪辑中创建一个 15 秒的剪辑。最后必须在 CameraRoll 中保存 15 秒的剪辑。

我有我的 3 秒视频剪辑AVCaptureMovieFileOutput,我有NSURL来自代表的,目前在NSTemporaryDirectory().

我正在使用AVAssetWriterInputfor 循环它。但它要求CMSampleBufferRef像:

我将如何CMSampleBufferRef从 NSTemporaryDirectory() 中的视频中看到这一点?

我已经看到了转换UIImage为的代码CMSampleBufferRef,但我可以找到任何用于视频文件的代码。

任何建议都会有所帮助。:)

0 投票
1 回答
1057 浏览

ios - 将 AudioBufferList 转换为 CMBlockBufferRef 时出错

我正在尝试使用 AVAssetReader 读取视频文件并将音频传递给 CoreAudio 进行处理(添加效果和内容),然后再使用 AVAssetWriter 将其保存回磁盘。我想指出,如果我将输出节点的 AudioComponentDescription 上的 componentSubType 设置为 RemoteIO,则可以通过扬声器正确播放。这让我确信我的 AUGraph 设置正确,因为我可以听到一切正常。我将 subType 设置为 GenericOutput,这样我就可以自己进行渲染并取回调整后的音频。

我正在阅读音频并将 CMSampleBufferRef 传递给 copyBuffer。这会将音频放入一个循环缓冲区,稍后将读取该缓冲区。

接下来我调用 processOutput。这将在 outputUnit 上进行手动重新编辑。当调用 AudioUnitRender 时,它会调用下面的playbackCallback,这就是我第一个节点上作为输入回调连接的内容。PlaybackCallback 从循环缓冲区中提取数据并将其馈送到传入的 audioBufferList 中。就像我之前所说的,如果将输出设置为 RemoteIO,这将导致音频在扬声器上正确播放。当 AudioUnitRender 完成时,它返回 noErr 并且 bufferList 对象包含有效数据。 当我调用 CMSampleBufferSetDataBufferFromAudioBufferList 虽然我得到 kCMSampleBufferError_RequiredParameterMissing (-12731)

我传入的 CMSampleBufferRef 看起来有效(下面是来自调试器的对象转储)

缓冲区列表如下所示

在这里真的很茫然,希望有人能帮忙。谢谢,

万一这很重要,我正在 ios 8.3 模拟器中调试它,音频来自我在 iphone 6 上拍摄的 mp4,然后保存到我的笔记本电脑。

我已阅读以下问题,但仍然无济于事,一切都无法正常工作。

如何将 AudioBufferList 转换为 CMSampleBuffer?

将 AudioBufferList 转换为 CMSampleBuffer 会产生意外结果

CMSampleBufferSetDataBufferFromAudioBufferList 返回错误 12731

核心音频离线渲染 GenericOutput

更新

我又看了看,注意到当我的 AudioBufferList 在 AudioUnitRender 运行之前看起来像这样:

mDataByteSize 是 numberFrames*sizeof(SInt32),也就是 512 * 4。当我查看在playbackCallback 中传递的AudioBufferList 时,列表看起来是这样的:

不太确定其他缓冲区的去向,或者其他 1024 字节大小...

如果当我完成给雷德纳的电话,如果我做这样的事情

并将 newbuff 传递给 CMSampleBufferSetDataBufferFromAudioBufferList 错误消失。

如果我尝试将 BufferList 的大小设置为 1 mNumberBuffers 或其 mDataByteSize 为 numberFrames*sizeof(SInt16) 我在调用 AudioUnitRender 时得到 -50

更新 2

我连接了一个渲染回调,以便在通过扬声器播放声音时检查输出。我注意到到扬声器的输出也有一个带有 2 个缓冲区的 AudioBufferList,输入回调期间的 mDataByteSize 是 1024,而在渲染回调中是 2048,这与我在手动调用 AudioUnitRender 时看到的相同。当我检查渲染的 AudioBufferList 中的数据时,我注意到 2 个缓冲区中的字节是相同的,这意味着我可以忽略第二个缓冲区。但是我不确定如何处理数据在渲染后的大小为 2048 而不是被接收时的 1024 的事实。关于为什么会发生这种情况的任何想法?在通过音频图之后,它是不是更多的是原始形式,这就是为什么大小加倍的原因?

0 投票
1 回答
1216 浏览

ios - 从 CMSampleBufferRef 获取当前视频时长

如何在委托方法中从 CMSampleBufferRef 获取当前录制的视频持续时间

请用示例代码指导

0 投票
3 回答
2992 浏览

ios - 设置 AVSampleBufferDisplayLayer 渲染样本缓冲区的速率

我正在使用 AVSampleBufferDisplayLayer 来显示通过网络连接以 h.264 格式出现的 CMSampleBuffers。视频播放流畅且工作正常,但我似乎无法控制帧速率。具体来说,如果我在 AVSampleBufferDisplayLayer 中以每秒 60 帧的速度排队,它会显示这 60 帧,即使视频是以 30 FPS 的速度录制的。

创建样本缓冲区时,可以通过将时间信息数组传递给 CMSampleBufferCreate 来设置演示时间戳(时间信息不存在于 h.264 流中,但可以计算或以容器格式传递)。我设置的演示时间戳相隔大约 0.033 秒,持续时间为 0.033,但显示层仍然每秒显示尽可能多的帧。

有两种方法可以在 AVSampleBufferDisplayLayer 上对缓冲区进行排队:每当缓冲区准备好时通过调用 -[AVSampleBufferDisplayLayer enqueueSampleBuffer:] 来“约束”,或者通过调用 -[AVSampleBufferDisplayLayer requestMediaDataWhenReadyOnQueue:usingBlock:] 并将缓冲区排队在该块中的“不受约束”。我已经尝试了这两种方法,但即使是第二种方法也尽可能快地显示缓冲区 - 例如,如果我在接收端排队了 300 帧,那么第一次执行上述方法中的块时,无论有多少,readyForMoreMediaData 都保持为真缓冲区被排入队列,并且它们都在很短的时间内显示出来。

如果在 CMSampleBuffer 上设置了 kCMSampleAttachmentKey_DisplayImmediately 附件,则此行为类似于人们所期望的,但是当前未设置(默认值为 false)。

我尝试设置图层 controlTimeBase,但似乎没有任何效果。我不知道要尝试的其他事情,也无法在网上找到示例。有谁知道如何控制 AVSampleBufferDisplayLayer 显示帧的帧速率?

0 投票
2 回答
2624 浏览

ios - CMSampleBufferGetImageBuffer 中的内存泄漏

我每 N 个视频帧从CMSampleBufferRef视频缓冲区获取一个UIImage ,例如:

XCode 和 Instruments 检测到内存泄漏,但我无法摆脱它。我像往常一样发布 CGImageRef 和 CMSampleBufferRef :

[更新] 我输入了AVCapture输出回调来获取sampleBuffer.

泄漏的代码是createCGImage:ciImage

甚至有一个autoreleasepool,CGImageReleaseCGImage引用和一个CIContext作为实例属性。

这似乎与此处解决的问题相同:Can't save CIImage to file on iOS without memory leaks

[更新]泄漏似乎是由于一个错误。这个问题 在 iOS 9 的 CIContext createCGImage 上的内存泄漏中有很好的描述?

一个示例项目显示了如何重现此泄漏:http ://www.osamu.co.jp/DataArea/VideoCameraTest.zip

最后的评论保证

看起来他们在 9.1b3 中修复了这个问题。如果有人需要适用于 iOS 9.0.x 的解决方法,我可以使用它:

在测试代​​码中(在这种情况下为 Swift):

iOS9.0 的解决方法应该是