- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在网上寻找,但似乎找不到我需要的教程或帮助。
使用 AVFoundation
和 Dlib 库,我创建了一个应用程序,可以使用手机上的前置摄像头从实时视频中检测人脸。我正在使用 Shape Predictor 68 Face Landmark
执行此操作。为此,我很确定我必须使用 AVCaptureVideoDataOutput
而不是 AVMovieFileOutput,以便可以分析每一帧。
我现在希望能够将视频保存到文件中,根据我收集到的内容,我需要使用 AVAssetWriter
来执行此操作。我只是无法在任何地方找到有关如何开始使用它的太多信息。我对 Swift 和 iOS 编程完全陌生,通过查看 Apple 的文档并不能真正理解很多。
如果有人能帮助我,我将不胜感激!
最佳答案
我找到了如何使用 AVAssetWriter 的方法。如果其他人需要帮助,我使用的代码如下:
func setUpWriter() {
do {
outputFileLocation = videoFileLocation()
videoWriter = try AVAssetWriter(outputURL: outputFileLocation!, fileType: AVFileType.mov)
// add video input
videoWriterInput = AVAssetWriterInput(mediaType: AVMediaType.video, outputSettings: [
AVVideoCodecKey : AVVideoCodecType.h264,
AVVideoWidthKey : 720,
AVVideoHeightKey : 1280,
AVVideoCompressionPropertiesKey : [
AVVideoAverageBitRateKey : 2300000,
],
])
videoWriterInput.expectsMediaDataInRealTime = true
if videoWriter.canAdd(videoWriterInput) {
videoWriter.add(videoWriterInput)
print("video input added")
} else {
print("no input added")
}
// add audio input
audioWriterInput = AVAssetWriterInput(mediaType: AVMediaType.audio, outputSettings: nil)
audioWriterInput.expectsMediaDataInRealTime = true
if videoWriter.canAdd(audioWriterInput!) {
videoWriter.add(audioWriterInput!)
print("audio input added")
}
videoWriter.startWriting()
} catch let error {
debugPrint(error.localizedDescription)
}
}
func canWrite() -> Bool {
return isRecording && videoWriter != nil && videoWriter?.status == .writing
}
//video file location method
func videoFileLocation() -> URL {
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
let videoOutputUrl = URL(fileURLWithPath: documentsPath.appendingPathComponent("videoFile")).appendingPathExtension("mov")
do {
if FileManager.default.fileExists(atPath: videoOutputUrl.path) {
try FileManager.default.removeItem(at: videoOutputUrl)
print("file removed")
}
} catch {
print(error)
}
return videoOutputUrl
}
// MARK: AVCaptureVideoDataOutputSampleBufferDelegate
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
let writable = canWrite()
if writable,
sessionAtSourceTime == nil {
// start writing
sessionAtSourceTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
videoWriter.startSession(atSourceTime: sessionAtSourceTime!)
//print("Writing")
}
if output == videoDataOutput {
connection.videoOrientation = .portrait
if connection.isVideoMirroringSupported {
connection.isVideoMirrored = true
}
}
if writable,
output == videoDataOutput,
(videoWriterInput.isReadyForMoreMediaData) {
// write video buffer
videoWriterInput.append(sampleBuffer)
//print("video buffering")
} else if writable,
output == audioDataOutput,
(audioWriterInput.isReadyForMoreMediaData) {
// write audio buffer
audioWriterInput?.append(sampleBuffer)
//print("audio buffering")
}
}
// MARK: Start recording
func start() {
guard !isRecording else { return }
isRecording = true
sessionAtSourceTime = nil
setUpWriter()
print(isRecording)
print(videoWriter)
if videoWriter.status == .writing {
print("status writing")
} else if videoWriter.status == .failed {
print("status failed")
} else if videoWriter.status == .cancelled {
print("status cancelled")
} else if videoWriter.status == .unknown {
print("status unknown")
} else {
print("status completed")
}
}
// MARK: Stop recording
func stop() {
guard isRecording else { return }
isRecording = false
videoWriterInput.markAsFinished()
print("marked as finished")
videoWriter.finishWriting { [weak self] in
self?.sessionAtSourceTime = nil
}
//print("finished writing \(self.outputFileLocation)")
captureSession.stopRunning()
performSegue(withIdentifier: "videoPreview", sender: nil)
}
我现在遇到另一个问题,当我同时使用 AVCaptureMetadataOutput、AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 时,此解决方案不起作用。当我添加 AVCaptureAudioDataOutput 时应用崩溃。
关于swift - 在 Swift 中使用 AVAssetWriter 将 AVCaptureVideoDataOutput 保存到电影文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51209310/
我使用 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 捕获特定大小的帧。 问题是缓
我是一名优秀的程序员,十分优秀!