AVAssetWriter: мгновенное отставание при начале записи - PullRequest
0 голосов
/ 22 февраля 2019

Я занимаюсь разработкой приложения, которое записывает видео с использованием AVAssetWriter (исходные носители - это примеры буферов, выводимых из captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection).

. Я заметил, что в первый раз, когда я создаю экземпляр моего AVAssetWriter, затемвызовите startWriting() и startSession(atSourceTime: CMTime), задержка составляет около 30 мс. Это приводит к кратковременному зависанию предварительного просмотра видео на экране, что также приводит к тому, что первые несколько кадров видео записываются неправильно.

Любопытно, что если я затем заново создаю свой экземпляр 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, который я установилкогда пользователь нажимает кнопку «Начать запись».

1 Ответ

0 голосов
/ 18 апреля 2019
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()

Вы можете попытаться выиграть время, выполнив те же действия в didFinishLaunchingWithOptions AppDelegate со стандартными videoCompressionSettings и audioCompressionSettings.На самом деле это не блокировка потока пользовательского интерфейса, а только подключение видео выхода AVCaptureVideoDataOutput.

...