swift 使用CMSampleBuffer和AVAssetWriter计算当前录制的视频容量

iqxoj9l9  于 2023-10-15  发布在  Swift
关注(0)|答案(1)|浏览(135)

我使用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
    }
mwngjboj

mwngjboj1#

您当前正在计算未压缩的原始图像缓冲区的大小。你写的肯定不是这个。通常,AVAssetWriter配置为写入压缩容器(如QuickTime或MPEG-4)。你似乎想要最终数据的大小。
要获得最终输出数据,请实现AVAssetWriterDelegate并将其分配为delegate。每次有输出数据要写入时,都会调用该对象。你可以在这里查看它的大小。
我不能立即记住当你使用基于URL的init时是否使用了委托。如果不是,则需要使用非URL init,并让委托自己编写文件,例如使用FileHandle。

相关问题