我正在开发一个使用AvassetWriter记录视频的应用程序(源媒体是从captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
输出的样本缓冲区。
我注意到第一次实例化AVAssetWriter
,然后致电startWriting()
和startSession(atSourceTime: CMTime)
,滞后约为30ms。这会导致屏幕上的视频预览暂时悬挂,这也导致视频的前几帧无法正确写入。
奇怪的是,如果我然后重新确定我的AVAssetWriter
并再次采取所有相同的步骤,那么从那时起,一切正常。这仅是第一次发生。
虽然也许太长而无法发布,但这是我确定发生错误的功能;
func insert(pixel buffer: CVPixelBuffer, with time: CMTime) {
// Check for unknown status
if fileWriter.status == .unknown {
guard startingVideoTime == nil else {
print("We've received an error setting the starting video time.")
return
}
startingVideoTime = time
if fileWriter.startWriting() {
fileWriter.startSession(atSourceTime: startingVideoTime!)
isRecording = true
}
}
// Append buffer
if videoInput.isReadyForMoreMediaData {
append(pixel: buffer, with: time)
isRecording = true
}
}
对于后代,我是从我的captureOutput
调用上述功能,仅在用户点击"开始记录"按钮时设置的self.isRecording = true
时,我才能进行此功能。
let videoCompressionSettings: [String: Any] = [
AVVideoCodecKey: AVVideoCodecType.h264,
AVVideoWidthKey: NSNumber(value: 1080),
AVVideoHeightKey: NSNumber(value: 1920)
]
let audioCompressionSettings: [String: Any] = [
AVNumberOfChannelsKey: NSNumber(value: 1),
AVEncoderAudioQualityForVBRKey: NSNumber(value: 91),
AVEncoderBitRatePerChannelKey:NSNumber(value: 9600),
AVEncoderBitRateStrategyKey: AVAudioBitRateStrategy_Variable,
AVFormatIDKey: NSNumber(value: 1633772320),
AVSampleRateKey: NSNumber(value: 44100)
]
// My own wrapper for AVAssetWriter
movieWriterManager = MovieWriterManager(videoUrl: recordingVideoURL(), audioUrl: recordingAudioURL(), videoCompressionSettings: videoCompressionSettings, audioCompressionSettings: audioCompressionSettings)
movieWriterManager?.warmup()
您可以尝试通过在AppDelegate的DodFinishLaunchingWithOptions上运行相同的步骤来购买时间,并使用默认的VideoCompressionsettings和AudioCompressionsettings。它实际上不是阻止UI线程,而是仅阻止AvcaptureVideDataOutput的视频输出连接。