用AVFoundation或CoreAudio捕获精确长度(以帧为单位)的视频



我正在尝试为音乐家制作一个涉及视频录制的应用程序。在应用程序中,用户首先选择节奏,时间签名和小节数,然后点击"录制"。按钮。当按钮被击中时,我开始播放节拍器并显示倒计时(4…3…2…1…),然后开始录音。录音将持续一段必要的时间,一帧也不能短,一帧也不能长。考虑到视频的最终用途(制作音乐),必须避免任何轻微的延迟。

我目前的解决方案使用AVCaptureMovieFileOutput()和ffmpeg来分析音频,找到正确的开始和结束,然后修剪视频。我想知道是否有一种方法可以捕获正确的长度,从使用AVCaptureVideoDataOutput()开始,或者使用较低级别的解决方案,如Core Audio。

您可以使用AVCaptureVideoDataOutput获取原始像素,并使用AVAssetWriter将它们写入文件。

我给出了一个相当粗糙的例子来说明如何做到这一点:它不会工作,因为我还没有启动会话,但是你应该明白。

import AVFoundation
class ViewController: UIViewController {

let captureSession = AVCaptureSession()
let effectVideoOutput = AVCaptureVideoDataOutput()
var assetWriter: AVAssetWriter!
var videoWriterInput: AVAssetWriterInput!
override func viewDidLoad() {
super.viewDidLoad()

if captureSession.canAddOutput(effectVideoOutput) {
captureSession.addOutput(effectVideoOutput)
effectVideoOutput.setSampleBufferDelegate(self, queue: nil)
}

let outputUrl = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("output.mp4")
assetWriter = try! AVAssetWriter(
outputURL: outputUrl,
fileType: AVFileType.mp4
)

videoWriterInput = AVAssetWriterInput(
mediaType: .video,
outputSettings: [
AVVideoCodecKey: AVVideoCodecType.h264,
AVVideoCompressionPropertiesKey: [
AVVideoAverageBitRateKey: 2300000,
AVVideoProfileLevelKey: AVVideoProfileLevelH264HighAutoLevel
],
AVVideoWidthKey: UIScreen.main.bounds.size.width,
AVVideoHeightKey: UIScreen.main.bounds.size.height
]
)
assetWriter.startWriting()
}
}
extension ViewController: AVCaptureVideoDataOutputSampleBufferDelegate {
func captureOutput(_ output: AVCaptureOutput, didDrop sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
videoWriterInput.append(sampleBuffer)
}
}

这个答案将帮助你衡量写作时长。

最新更新