我创建了一个压缩视频文件的功能。它使用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
有谁能看到这里的问题是什么?谢谢!
答案 0 :(得分:0)
代码的第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从阅读器中捕获和处理缓冲区。