Search code examples
iosswiftavfoundationavassetreader

iOS - Trimming mp4 on device


I thought I might be able to use an AVAssetReader/Writer to trim an MP4, but when I attempt to read the audio (haven't tried video yet), I get this:

AVAssetReaderOutput does not currently support compressed output

Is there any way to read an MP4 off disk via AVAssetReader?

let asset: AVAsset = AVAsset(URL: NSURL(fileURLWithPath: filePath))
        let audioTrack: AVAssetTrack = asset.tracksWithMediaType(AVMediaTypeAudio)[0]
        let audioTrackOutput: AVAssetReaderOutput = AVAssetReaderTrackOutput(track: audioTrack, outputSettings:
        [AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC)])

        if let reader = try? AVAssetReader(asset: asset) {
            if reader.canAddOutput(audioTrackOutput) {
                reader.addOutput(audioTrackOutput)
            }
            reader.startReading()

            var done = false
            while (!done) {
                let sampleBuffer: CMSampleBufferRef? = audioTrackOutput.copyNextSampleBuffer()
                if (sampleBuffer != nil) {
                    print("buffer")
                    //process
                } else {
                    if (reader.status == AVAssetReaderStatus.Failed) {
                        print("Error: ")
                        print(reader.error)
                    } else {
                        done = true
                    }
                }
            }
        }

Solution

  • AVAssetExportSession is the solution. SCAssetExportSession works even better.