2016-09-20 4 views
0

Я создал функцию сжатия видеофайла. Он использует AVAssetWriter и добавляет входы и выходы для видео- и аудиодорожек. Когда он начинает писать, я получаю сообщение об ошибке, когда AVAssetReader для звуковой дорожки начинает чтение, audioReader.startReading(). Здесь ошибка, *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVAssetReader startReading] cannot be called again after reading has already started'.Сжатие видео с использованием AVAssetWriter

Код: https://gist.github.com/jaumevn/9ba329aaf49c81c57a276fd135f53f20

Может кто-нибудь увидеть, что здесь проблема? Благодаря!

ответ

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 для захвата и обработки буфера от считывателя.

Смежные вопросы