1

私はビデオ ストリームを見て.mp4ファイルを作成しているので、ほとんどのことを正しく行っています。私の問題は、ビデオ ファイルが 0kb で空であることです。iOS デバイスを使用して、カメラ付きの別のデバイスを制御しています。このカメラはビデオ ストリームを iOS デバイスに送信しており、そのストリームは にデコードされてCMSampleBufferから に変換され、CVPixelBufferに表示されますUIImageView。私は問題なくビデオを表示しています (そして、別の問題は、pls がコメントを残すことを修正することについて何か知っている場合、-12909 エラーが発生することです)。

オブジェクトを記録しようとしCMSampleBufferましたが、出力設定を除外する必要があるというコンパイラ エラーが表示されました。だから私はそれらを削除し、空のファイルを保存します。

ストリームが開始したら、これを呼び出します。

func beginRecording() {
    handlePhotoLibraryAuth()
    createFilePath()
    guard let videoOutputURL = outputURL,
        let vidWriter = try? AVAssetWriter(outputURL: videoOutputURL, fileType: AVFileType.mov) else {
            fatalError("AVAssetWriter error")
    }
    let vidInput = AVAssetWriterInput(mediaType: AVMediaType.video, outputSettings: nil)

    guard vidWriter.canAdd(vidInput) else {
        print("Error: Cant add video writer input")
        return
    }
    vidInput.expectsMediaDataInRealTime = true
    vidWriter.add(vidInput)
    guard vidWriter.startWriting() else {
        print("Error: Cant write with vid writer")
        return
    }
    vidWriter.startSession(atSourceTime: CMTime.zero)

    self.videoWriter = vidWriter
    self.videoWriterInput = vidInput
    self.isRecording = true
    print("Recording: \(self.isRecording)")
}

そして、これで終わりです:

func endRecording() {
    guard let vidInput = videoWriterInput, let vidWriter = videoWriter else {
        print("Error, no video writer or video input")
        return
    }
    vidInput.markAsFinished()
    vidWriter.finishWriting {
        print("Finished Recording")
        self.isRecording = false
        guard vidWriter.status == .completed else {
            print("Warning: The Video Writer status is not completed, status: \(vidWriter.status)")
            return
        }
        print("VideoWriter status is completed")
        self.saveRecordingToPhotoLibrary()
    }
}

への追加操作AVAssetWriterInputが失敗していると判断しました

これが私の現在の追加コードです。最初にリアルタイムで CMSampleBuffer を試しましたが、なぜ機能しなかったのかわかりません。リアルタイム機能は iOS デバイスの AV コンポーネントにのみ適用され、他の接続されたデバイスには適用されないのではないかと思います。それから私はこれを試しましたが、おそらくうまくいくはずですが、そうではありません。30 fps と 60 fps の両方を試しましたが、30 のはずです。CMTime を誤用していませんか? CMTime を使用しないようにしようとしていたため、前述のように機能しませんでした。

        if self.videoDecoder.isRecording,
            let videoPixelBuffer = self.videoDecoder.videoWriterInputPixelBufferAdaptor,
            videoPixelBuffer.assetWriterInput.isReadyForMoreMediaData {
            print(videoPixelBuffer.append(frame, withPresentationTime: CMTimeMake(value: self.videoDecoder.videoFrameCounter, timescale: 30)))
            self.videoDecoder.videoFrameCounter += 1
        }
4

1 に答える 1