我使用AVCaptureVideoDataOutputSampleBufferDelegate和函数**func captureOutput(_ output:AVCaptureOutput,didOutput sampleBuffer:CMSampleBuffer,来自连接:AVCaptureConnection)**我使用AVAssetWriter将接收到的CMSampleBuffers作为视频保存保存到生成的url。我需要让用户看到不断更新的录制视频的能力。我使用calculateSampleBufferSize函数累积CMSampleBuffer以显示,但结果不准确。有人知道如何从CMSampleBuffer中正确计算它吗?谢谢
下面是我实现的代码
func writeBufferVideoToFile(assetWriter: AVAssetWriter,
sampleBuffer: CMSampleBuffer) {
guard isRecoding else {
return
}
// Setup start record
if assetWriter.status == .unknown {
totalBytesWritten = 0
assetWriter.startWriting()
assetWriter.startSession(atSourceTime: CMSampleBufferGetPresentationTimeStamp(sampleBuffer))
}
// Record data
if let assetWriterInput = assetWriter.currentInput,
assetWriterInput.isReadyForMoreMediaData {
// Calculate the total number of bytes written
totalBytesWritten += Double(calculateSampleBufferSize(sampleBuffer: sampleBuffer))
// Record
assetWriterInput.append(sampleBuffer)
}
}
func calculateSampleBufferSize(sampleBuffer: CMSampleBuffer) -> Int {
guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
return 0
}
CVPixelBufferLockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))
let size = CVPixelBufferGetDataSize(imageBuffer)
CVPixelBufferUnlockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))
return size
}
1条答案
按热度按时间mwngjboj1#
您当前正在计算未压缩的原始图像缓冲区的大小。你写的肯定不是这个。通常,AVAssetWriter配置为写入压缩容器(如QuickTime或MPEG-4)。你似乎想要最终数据的大小。
要获得最终输出数据,请实现AVAssetWriterDelegate并将其分配为
delegate
。每次有输出数据要写入时,都会调用该对象。你可以在这里查看它的大小。我不能立即记住当你使用基于URL的
init
时是否使用了委托。如果不是,则需要使用非URLinit
,并让委托自己编写文件,例如使用FileHandle。