- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:
我使用 AVCaptureVideoDataOutput
与 AVCaptureSession
和其他各种 AV
工具配合来创建视频 session ,以便我可以创建相机 session 。我可以实时了解相机在屏幕上看到的内容。
我使用 AVCaptureVideoDataOutput
而不是 AVCaptureMovieFileOutput
,因为我通过实时源获取的图像是使用 CIFilter
进行处理的。现在,我想记录按下按钮时向用户显示的内容。我对此的想法是使用下面的函数,因为我认为该函数捕获每一帧。我从 Apple's Page 中推断出这一点:
Delegates receive this message whenever the output captures and outputs a new video frame, decoding or re-encoding it as specified by its videoSettings property. Delegates can use the provided video frame in conjunction with other APIs for further processing.
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
我希望每个帧都在这里,这样我就可以使用 AVAssetWriter
并将缓冲区添加到 videoWriterInput
中。可以看到here,其中答案表明func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
方法每次都将sampleBuffer
添加到videoWriterInput
中。
我的努力:
我试图模拟上面的SO帖子,其中答案利用AVAssetWriter
将AVCaptureVideoDataOutput
写入文件。但是,我的代码(如下所示)没有调用 AVCaptureVideoDataOutputSampleBufferDelegate
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
委托(delegate)方法。
注意:这不是全部代码 - 我仅添加相关部分 - 如果缺少您需要的内容,请告诉我
VideoCapture.swift
class VideoCapture: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate {
private let captureSession = AVCaptureSession()
private let videoDataOutput = AVCaptureVideoDataOutput()
private let dataOutputQueue = DispatchQueue(label: "com.Camera.dataOutputQueue")
private var videoConnection: AVCaptureConnection!
//NEVER GETS CALLED
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
print("Buf: \(sampleBuffer)")
}
func captureOutput(_ output: AVCaptureOutput, didDrop sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
print("Drop Buff: \(sampleBuffer)")
}
init() {
//Some Setup
captureSession.sessionPreset = AVCaptureSession.Preset.high
//...
do {
// video output
videoDataOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String: Int(kCVPixelFormatType_32BGRA)]
videoDataOutput.alwaysDiscardsLateVideoFrames = true
videoDataOutput.setSampleBufferDelegate(self, queue: dataOutputQueue)
guard captureSession.canAddOutput(videoDataOutput) else { fatalError() }
captureSession.addOutput(videoDataOutput)
videoConnection = videoDataOutput.connection(with: .video)
}
//...
}
}
AnotherFile.swift
class VC: UIViewController {
private var videoCapture: VideoCapture!
init() {
self.videoCapture = VideoCapture()
}
public override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
guard let videoCapture = videoCapture else {return}
videoCapture.startCapture()
}
}
我的期望:
我期待这个方法
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
被调用并至少打印出上面示例中的缓冲区。这没有发生,所以我无法进一步开发并将缓冲区插入 videoWriteInput
中进行记录。
实际发生的情况:
它从未被调用过。我确保使用 videoDataOutput.setSampleBufferDelegate(self, queue: dataOutputQueue)
设置委托(delegate),并清楚地表明委托(delegate)方法已创建。我确信使用自动完成功能,以便该方法是从 XCode 创建的,这样我就不会弄乱方法名称,例如 this SO post 。
问题:
我怎样才能正确地获取要调用的方法 - 假设我的直觉是正确的,该方法会为每个帧调用,并且是一个可以插入到我的 videoWriterInput
中的缓冲区 - 这样我就可以从 AVCaptureSession
录制视频我可以在屏幕上看到吗?
值得注意:
This 项目不在调用方面起作用
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
而 this 确实有效。
编辑:
我发现由于某种原因,AVCaptureDataOutputSynchronizer
导致它无法调用委托(delegate)函数。有什么想法吗?
最佳答案
好吧,我已经找到我受折磨的理由了。所以,我使用 AVCaptureMetadataOutput
, AVCaptureDepthDataOutput
, AVCaptureAudioDataOutput
,和AVCaptureVideoDataOutput
并使用 AVCaptureDataOutputSynchronizer
将它们组合起来。
因为我正在使用AVCaptureDataOutputSynchronizer
,它正在捕获此处的所有委托(delegate)调用。例如,我可以同步我的数据,它会调用 AVCaptureDataOutputSynchronizer
委托(delegate)方法而不是其他单独的委托(delegate)。
dataOutputSynchronizer = AVCaptureDataOutputSynchronizer(dataOutputs: [videoDataOutput, depthDataOutput, metadataOutput])
dataOutputSynchronizer.setDelegate(self, queue: dataOutputQueue)
//... Some Code Later...
func dataOutputSynchronizer(_ synchronizer: AVCaptureDataOutputSynchronizer, didOutput synchronizedDataCollection: AVCaptureSynchronizedDataCollection) {
guard let syncedVideoData = synchronizedDataCollection.synchronizedData(for: videoDataOutput) as? AVCaptureSynchronizedSampleBufferData else { return }
guard !syncedVideoData.sampleBufferWasDropped else {
print("dropped video:\(syncedVideoData)")
return
}
let videoSampleBuffer = syncedVideoData.sampleBuffer
print(videoSampleBuffer)
let syncedDepthData = synchronizedDataCollection.synchronizedData(for: depthDataOutput) as? AVCaptureSynchronizedDepthData
var depthData = syncedDepthData?.depthData
if let syncedDepthData = syncedDepthData, syncedDepthData.depthDataWasDropped {
print("dropped depth:\(syncedDepthData)")
depthData = nil
}
// 顔のある位置のしきい値を求める
let syncedMetaData = synchronizedDataCollection.synchronizedData(for: metadataOutput) as? AVCaptureSynchronizedMetadataObjectData
var face: AVMetadataObject? = nil
if let firstFace = syncedMetaData?.metadataObjects.first {
face = videoDataOutput.transformedMetadataObject(for: firstFace, connection: videoConnection)
}
guard let imagePixelBuffer = CMSampleBufferGetImageBuffer(videoSampleBuffer) else { fatalError() }
}
这会按预期在每一帧被调用,我可以获得单独的数据集、音频、视频等,并用它们做我喜欢的事情。
关于swift - 使用 AVCaptureVideoDataOutput 正确录制视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57048430/
我使用 AVCaptureVideoDataOutput 从相机检索图像并显示在 iPhone 显示屏上。我在使用 iOS8.4 的 iPhone 6 plus 上运行代码,效果很好。图像全屏显示。但
我正在使用 AVFoundation 框架用 iPhone 摄像头捕捉视频,我的代码: self.session = [[AVCaptureSession alloc] init]; ... s
我正在捕获视频并将其转换为 CGImage 来对其进行处理。它将工作约 10 秒,收到内存警告,然后崩溃(通常表示数据格式化程序暂时不可用)。有人可以帮我解决这个问题吗? - (void) captu
我正在编写一个应用程序,它对从 AVCaptureSession 中的 AVCaptureVideoDataOutput 获取的图像数据进行一些实时处理。 我目前能够启动 session ,添加输入和
无论如何使用 AVCaptureVideoDataOutput (或其他方式?)以每秒至少 30 帧的速度在 10 位 P3 颜色空间中获取 CMSampleBuffers?我可以将 AVCaptur
我有一个 layerRect 显示我的相机的图像是这样的: CGRect layerRect = [[videoStreamView layer] bounds]; [[[self captureMa
背景: 我使用 AVCaptureVideoDataOutput 与 AVCaptureSession 和其他各种 AV 工具配合来创建视频 session ,以便我可以创建相机 session 。我
如果我们使用 AVCaptureMovieFileOutput,我们有 recordedDuration 属性,它给出了录制视频的长度。 但是,对于使用 AVCaptureVideoDataOutpu
借助 iOS4 中包含的 AVFoundation 中的新视频功能,可以使用 AVCaptureVideoDataOutput 访问相机捕获的原始视频帧。 我想在这些帧上叠加文本和其他信息,然后将它们
我不确定我应该在方法中放入什么 - (void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSam
我正在使用 AVCaptureScreenInput 在 Mac 上尝试屏幕捕获,但从未调用 AVCaptureVideoDataOutput 委托(delegate) captureOutput,我
这就是问题所在。我正在使用 AVCaptureVideoDataOutput 从相机获取视频帧并使用 AVAssetWriter 从中制作视频。它工作正常,但我得到的视频是颠倒的,因为我的应用程序的设
我正在使用 AVCaptureSession 获取相机输出并成功添加了音频和视频输入和输出。 { var captureDevice = AVCaptureDevice.defaultDevi
根据this documentation ,AVCaptureVideoDataOutput 应该允许通过像素格式选项kCVPixelFormatType_128RGBAFloat 将图像捕获为 fl
我运行了一个 AVCaptureVideoDataOutput session ,设置如下,效果很好,并将缓冲区记录到文件中。 我还想录制音频,但缓冲区中似乎没有任何音频,即使我已将麦克风添加为 ca
Apple 最近的示例代码之一使用相同的串行队列从 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 委托(delegate)接收示例。我需要知道
我想保存视频流中的图像,我已将 session 预设设置为 AVCaptureSessionPresetPhoto,但我在设备上获得的分辨率非常低。我在 3GS 上进行测试,此预设返回 512x384
我正在使用 AVFoundation 从后置摄像头捕获视频,并希望在按下开始按钮时处理帧。问题是,在我按下开始按钮的那一刻,我从样本缓冲区中抓取帧并对其进行处理,但我得到的帧似乎是过去的帧,这意味着不
我正在向我的 AVCaptureVideoDataOutput 添加 key 。添加 key 时 AVVideoProfileLevelKey 系统抛出我 -> Failed to set (cont
我正在尝试通过设置 kCVPixelBufferWidthKey 和 kCVPixelBufferHeightKey 从 AVCaptureVideoDataOutput 捕获特定大小的帧。 问题是缓
我是一名优秀的程序员,十分优秀!