【问题标题】:Video compression using AVAssetWriter使用 AVAssetWriter 进行视频压缩
【发布时间】:2016-09-20 10:23:42
【问题描述】:
我创建了一个压缩视频文件的函数。它使用AVAssetWriter 并为视频和音频轨道添加输入和输出。当它开始写入时,当音轨的AVAssetReader 开始读取时,我收到一个错误audioReader.startReading()。这里是错误,*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVAssetReader startReading] cannot be called again after reading has already started'。
代码:https://gist.github.com/jaumevn/9ba329aaf49c81c57a276fd135f53f20
谁能看出这里有什么问题?谢谢!
【问题讨论】:
标签:
ios
video
compression
avfoundation
【解决方案1】:
代码的第 77 行,您正在同一个文件上启动第二个 AVAssetReader。
您不需要连接两个阅读器,而是应该连接您的 AVAudioAssetReader 作为现有 AVAssetReader 的输出。
类似这样的:
let videoReaderSettings : [String : Int] = [kCVPixelBufferPixelFormatTypeKey as String : Int(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)]
let videoReaderOutput = AVAssetReaderTrackOutput(track: videoAssetTrack, outputSettings: videoReaderSettings)
let videoReader = try! AVAssetReader(asset: videoAssetUrl)
var settings = [String : AnyObject]()
settings[AVFormatIDKey] = Int(kAudioFormatLinearPCM)
let audioReaderOutput = AVAssetReaderTrackOutput(track: audioAssetTrack, outputSettings: settings)
videoReader.addOutput(videoReaderOutput)
videoReader.addOutput(audioReaderOutput)
videoWriter.startWriting()
videoReader.startReading()
研究使用 AVCaptureVideoDataOutputSampleBufferDelegate 和 AVCaptureAudioDataOutputSampleBufferDelegate 来捕获和处理来自阅读器的缓冲区。