AVAssetWriter:开始写入时的瞬间延迟

问题描述 投票:0回答:1

我正在开发一个使用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中这样做,我在用户点击“开始记录”按钮时设置。

ios swift avfoundation avassetwriter
1个回答
0
投票
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()

您可以尝试使用默认的videoCompressionSettings和audioCompressionSettings在AppDelegate的didFinishLaunchingWithOptions上运行相同的步骤来购买时间。它实际上并不阻止UI线程,而只阻止AVCaptureVideoDataOutput的视频输出连接。

© www.soinside.com 2019 - 2024. All rights reserved.