- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我能够组装一个最小的屏幕录制 Swift 演示,用于调试另一件事,但有些东西告诉我 - AVFoundation
从未调用我的委托(delegate)进行录制。事实上,他们都不是。
代码非常简单:
class ExampleRecorder: NSObject, AVCaptureFileOutputRecordingDelegate {
private var session: AVCaptureSession?;
private var fileOut: AVCaptureMovieFileOutput?;
func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
print("Recording delegate WAS CALLED")
}
func record() {
self.session = AVCaptureSession()
self.session!.beginConfiguration() //As per Apple docs for atomic config updates
// Wire input
let captureInput = AVCaptureScreenInput(displayID: CGMainDisplayID())
guard self.session!.canAddInput(captureInput!) else {
assertionFailure("Failed to add input")
return
}
self.session!.addInput(captureInput!)
// Wire output
self.fileOut = AVCaptureMovieFileOutput()
guard self.session!.canAddOutput(self.fileOut!) else {
assertionFailure("Failed to add output")
return
}
session!.addOutput(self.fileOut!)
// Just check the wiring
print(self.session!.connections)
self.session!.commitConfiguration()
// This should be blocking and ACTUALLY start the session as per
// https://developer.apple.com/documentation/avfoundation/avcapturesession
self.session!.startRunning()
print("Is session running? \(self.session!.isRunning)")
self.fileOut!.startRecording(to: self.getTemp(), recordingDelegate: self)
print("Is recording running? \(self.fileOut!.isRecording)")
//Simply stop the recording after 5 seconds
Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(stopRecord(_:)), userInfo: nil, repeats: false)
}
//Nothing to see here - boilerplate to create UNIQUE temporary file
private func getTemp() -> URL
{
let tempName = NSUUID().uuidString
let tempPath = (NSTemporaryDirectory() as NSString).appendingPathComponent((tempName as NSString).appendingPathExtension("mov")!)
print("Temp path: \(tempPath)")
return URL(fileURLWithPath: tempPath)
}
@objc func stopRecord(_ timer: Timer?)
{
print("Is session running after 5 sec? \(self.session!.isRunning)")
print("Is record running after 5 sec? \(self.fileOut!.isRecording)")
fileOut?.stopRecording()
}
}
只需调用 ExampleRecorder().record()
即可毫无问题地执行录制,并在录制完成后几秒钟后保存文件,但“已调用录制委托(delegate)” 永远不会被打印:
2020-01-20 00:37:10.764852-0600 HEVCRecorder[29875:2886265] Metal API Validation Enabled
[<AVCaptureConnection: 0x60000026f160 [type:vide][enabled:1][active:1]>]
2020-01-20 00:37:12.061411-0600 HEVCRecorder[29875:2886265] [plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x6000002775e0> 30010C1C-93BF-11D8-8B5B-000A95AF9C6A
Is session running? true
Temp path: /var/folders/mv/tlzj_p0d4b9cgm854s3n73zc0000gn/T/DFCC195F-2415-4F80-AC21-25C1DB0CD181.mov
Is recording running? false
2020-01-20 00:37:12.295775-0600 HEVCRecorder[29875:2886688] GVA info: preferred scaler idx 1
2020-01-20 00:37:12.299733-0600 HEVCRecorder[29875:2886688] GVA encoder info: recomputed for fps: 15.000000, gop size in pics: 15, gop size in sec: 1.000000
GVA encoder info: recomputed for fps: 15.000000, gop size in pics: 15, gop size in sec: 1.000000
2020-01-20 00:37:12.582543-0600 HEVCRecorder[29875:2886700] GVA info: preferred scaler idx 1
2020-01-20 00:37:12.586830-0600 HEVCRecorder[29875:2886700] GVA encoder info: recomputed for fps: 15.000000, gop size in pics: 15, gop size in sec: 1.000000
GVA encoder info: recomputed for fps: 15.000000, gop size in pics: 15, gop size in sec: 1.000000
Is session running after 5 sec? true
Is record running after 5 sec? true
为了确保我使用断点验证了相同的结果。谁能指出我的方向吗?我来回查看了文档,但找不到任何原因(我也尝试了一个单独的对象和其他委托(delegate)回调)没有调用委托(delegate)方法。
最佳答案
我终于解决了这个问题。事实上,问题中发布的示例是正确的并且有效。
什么不起作用是这样的:
let delegate = BrandNewObject()
self.fileOut!.startRecording(to: self.getTemp(), recordingDelegate: delegate)
不知何故,这样做委托(delegate)会被忽略。也许该对象已被清除?
关于swift - AVCaptureMovieFileOutput 从不调用屏幕录制上的委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59818119/
我正在使用 AVCaptureMovieFileOutput 录制视频。然而,我只想保留最后 2 分钟的视频,而不是在整个录制时间内保留捕获的视频。本质上,我想创建一个视频的尾随缓冲区。 我尝试通过将
我使用以下代码来捕获视频并将其保存到我的应用程序的文档文件夹中: AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput
我正在尝试在我的应用程序中实现自定义视频录制和图像捕获。我已经设置了 AVCaptureSession 和所有必要的输入/输出来捕获音频、视频和静态图像。但是,我录制完视频后,输出文件不存在。由于输出
我目前能够将视频录制到 AVCaptureMovieFileOutput 实例,但我找不到任何可以学习的资源,这些资源显示了如何像 snapchat/facebook/instagram 那样播放视频
我想在一系列流畅、可变长度的剪辑中录制视频/音频。也就是说,vid1.mp4 后跟 vid2.mp4 应该无缝连接在一起,或者几乎是无缝连接。 我目前的问题是我似乎无法在不出错的情况下立即切换文件。
我正在开发一个 osx 捕获应用程序,我可以使用 AVFoundation 提供的文件格式 UTIs 来分配文件输出格式,如 .mov、.mp4、 .m4v 等 我可以创建自定义文件格式 UTIs 来
正如标题所述,我希望在用户使用 AVFoundation 录制视频时显示当前的录制长度。我对 AVAudioRecorder 做了类似的事情,我创建了一个计时器来设置标签的文本,如下所示: recor
我能够组装一个最小的屏幕录制 Swift 演示,用于调试另一件事,但有些东西告诉我 - AVFoundation 从未调用我的委托(delegate)进行录制。事实上,他们都不是。 代码非常简单: c
当我的应用程序启动时,我试图使用 AVCaptureMovieFileOutput 将设备相机录制到视频文件中。令我非常沮丧的是,我无法让它工作: 我可以使用 AVCaptureVideoPrevie
当应用程序在视频录制和拍照之间切换时,我想防止延迟:通过仅使用 AVCaptureMovieFileOutput 并在捕获图像时从中获取快照。 就像 SnapChat 一样。 这有可能吗?我还没有找到
我试图阻止 AVCaptureSession 在没有足够的磁盘空间时添加 AVCaptureMovieFileOutput。我在 viewDidload 中使用以下代码进行测试: let sessio
我对 captureStillImageAsynchronouslyFromConnection 有一个奇怪的问题。如果我在镜像视频时使用 jpegStillImageNSDataRepresenta
我尝试了几种不同的方法,但它们对我没有帮助。我想更改 AVFoundation 中的视频方向。我怎样才能做到? override func viewDidLoad() { super.
我尝试使用以下代码从 iphone 相机保存视频文件: class Camera { ... private func loadDeviceInput() { let devices = AV
我正在尝试使用 AVFoundation 在我的 iPhone 应用程序中录制视频。但是每当我单击“录制”按钮时,应用程序就会崩溃并显示此消息 -[AVCaptureMovieFileOutput s
我需要将屏幕视频从 Mac 实时发送到多播组,例如“239.1.1.110:46110”。 我知道 AVCaptureMovieFileOutput 有一个方法“startRecordingToOut
我已经创建了一个电影文件,并且能够将其本地保存到设备上。不过,我想利用 icloud 文档并将其保存到 icloud 并公开共享。如何使用 swift 做到这一点? 我找到了这个用于保存一般文件的链接
目前我正在尝试使用 AVCaptureMovieFileOutput 录制视频并将其保存到照片库。然而,一旦照片库的 URL 传递到 startRecording 函数,它就会声称“在此服务器上找不到
我正在创建一个使用 AVFoundation 的相机应用程序。 当我用我的 AVCaptureStillImageOutput 对象拍照时,它会发出与默认相机相同的“快门”噪音,而无需我告诉 AVCa
用例:我想捕捉来自相机的输入,在捕捉的帧(和声音)之上绘制并将结果保存为 .mov 文件。 我看到我可以使用 AVCaptureSession 捕获相机的输入。 我可以使用 AVCaptureMovi
我是一名优秀的程序员,十分优秀!