使用AVFoundation将视频帧写入存储器,并使用AVFoundation读回这些帧
我发现不可能将帧流(从网络摄像头)写入存储器,然后稍后再将帧读出。如果我使用AVVideoCodecH264中的AssetWriter编写它们,那么我无法使用AssetTreader读取它们,因为我遇到以下错误: AVAssetReaderOutput当前不支持压缩输出 如果我尝试写未压缩的(从outputsettings中删除AVVIdeoCodecH264),则会得到相反的错误 AVAssetWriter当前不支持未压缩的输出(意译) 所以我只能用压缩格式写,也只能用未压缩格式读,即使写/读函数属于同一个API 有什么想法吗 下面是编写代码:使用AVFoundation将视频帧写入存储器,并使用AVFoundation读回这些帧,avfoundation,opentok,tokbox,Avfoundation,Opentok,Tokbox,我发现不可能将帧流(从网络摄像头)写入存储器,然后稍后再将帧读出。如果我使用AVVideoCodecH264中的AssetWriter编写它们,那么我无法使用AssetTreader读取它们,因为我遇到以下错误: AVAssetReaderOutput当前不支持压缩输出 如果我尝试写未压缩的(从outputsettings中删除AVVIdeoCodecH264),则会得到相反的错误 AVAssetWriter当前不支持未压缩的输出(意译) 所以我只能用压缩格式写,也只能用未压缩格式读,即使写/读
outputSettings = [AVVideoCodecKey : AVVideoCodecH264,
AVVideoWidthKey : NSNumber(value: Float(640)),
AVVideoHeightKey : NSNumber(value: Float(480))]
as [String : Any]
assetWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo,
outputSettings: outputSettings)
pixelBufferAdaptor = AVAssetWriterInputPixelBufferAdaptor(
assetWriterInput: assetWriterInput!,
sourcePixelBufferAttributes: [ kCVPixelBufferPixelFormatTypeKey
as String : Int(kCVPixelFormatType_420YpCbCr8PlanarFullRange)])
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let fileUrl = paths[0].appendingPathComponent("output.mov")
try? FileManager.default.removeItem(at: fileUrl)
assetWriter = try? AVAssetWriter(url: fileUrl, fileType: AVFileTypeMPEG4)
assetWriter?.add(assetWriterInput!)
assetWriterInput!.expectsMediaDataInRealTime = true
assetWriter?.startWriting()
saving = true;
assetWriter?.startSession(atSourceTime: kCMTimeZero)
以及用于阅读的代码…
let asset = AVAsset(url: fileUrl)
self.assetReader = try? AVAssetReader(asset: asset);
guard let videoTrack = asset.tracks(withMediaType: AVMediaTypeVideo).first
else { return }
self.assetReaderOutput = AVAssetReaderTrackOutput(
track: videoTrack,
outputSettings:[String(kCVPixelBufferPixelFormatTypeKey):
NSNumber(value: kCVPixelFormatType_420YpCbCr8PlanarFullRange)])
self.assetReader!.add(self.assetReaderOutput!)
self.assetReader!.startReading()
希望这能为你指明正确的方向;谷歌“outputSettings:decompressionVideoSettings”,看看威尔的博客:和评论AVVideoComposition@sorceri这是一个很好的资源。比目前为止我能找到的任何东西都好。谢谢分享。我希望我能解决我的问题。如果我这样做了,我会回到这里,请你发布一个答案,这样我就可以给你赏金了。非常感谢。