使用AVAssetWriter进行视频压缩

时间:2016-09-20 10:23:42

标签: ios video compression avfoundation

我创建了一个压缩视频文件的功能。它使用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

有谁能看到这里的问题是什么?谢谢!

1 个答案:

答案 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从阅读器中捕获和处理缓冲区。