我正在看到一个视频流并制作.mp4
文件,所以我做的大部分都是正确的。我的问题是我的视频文件是 0kb,是空的。我正在使用 iOS 设备来控制带有摄像头的单独设备。此相机正在向 iOS 设备发送视频流,该视频流被解码为 aCMSampleBuffer
然后转换为 aCVPixelBuffer
并显示在UIImageView
. 我正在很好地显示视频(另一个问题是,如果您知道有关修复该问题的任何信息,请发表评论,我会收到 -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 和 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
}