私はビデオ ストリームを見て.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
}