使用AVFoundation将视频帧写入存储,并使用AVFoundation读回这些帧

时间:2017-12-19 21:44:05

标签: avfoundation opentok tokbox

我发现无法将帧流(从网络摄像头)写入存储,然后在以后读取帧。如果我在AVVideoCodecH264中使用AssetWriter编写它们,那么我无法使用AssetReader读取它们,因为我收到以下错误:

  

AVAssetReaderOutput目前不支持压缩输出

如果我尝试写未压缩的(从输出设置中删除AVVIdeoCodecH264),那么我得到相反的错误。

  

AVAssetWriter目前不支持未压缩的输出(释义)

所以我只能用压缩格式编写,我只能读取未压缩的格式,即使写/读函数属于同一个API !!!

有什么想法吗?

以下是撰写代码:

    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()

0 个答案:

没有答案