iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
音声も動画も、同じデリゲートのメソッドで受けるようにしている。
書き込む動画の形式は、録画されたデータを受け取ってみないと分からないので、最初のサンプリング・データ受信に形式を取得している。
            if self.assetWriter == nil {
                let fileManager = NSFileManager()
                if fileManager.fileExistsAtPath(self.outputFilePath!) {
                    fileManager.removeItemAtPath(self.outputFilePath!, error: nil)
                }
                
                if captureOutput == self.videoDataOutput {
                }
                else if captureOutput == self.audioDataOutput {
                    let fmt = CMSampleBufferGetFormatDescription(sampleBuffer)
                    let asbd = CMAudioFormatDescriptionGetStreamBasicDescription(fmt)
                    
                    var outError: NSError? = nil
                    let url = NSURL(fileURLWithPath: self.outputFilePath!)
                    self.assetWriter = AVAssetWriter(URL: url, fileType: AVFileTypeQuickTimeMovie, error: &outError)
                    
                    let videoOutputSettings: Dictionary = [
                        AVVideoCodecKey : AVVideoCodecH264,
                        AVVideoWidthKey : self.width,
                        AVVideoHeightKey : self.height
                    ]
                    self.videoAssetWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: videoOutputSettings)
                    self.videoAssetWriterInput!.expectsMediaDataInRealTime = true
                    self.assetWriter!.addInput(self.videoAssetWriterInput)
                    
                    let audioOutputSettings: Dictionary = [
                        AVFormatIDKey : kAudioFormatMPEG4AAC,
                        AVNumberOfChannelsKey : Int(asbd.memory.mChannelsPerFrame),
                        AVSampleRateKey : asbd.memory.mSampleRate,
                        AVEncoderBitRateKey : 128000
                    ]
                    self.audioAssetWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeAudio, outputSettings: audioOutputSettings)
                    self.audioAssetWriterInput!.expectsMediaDataInRealTime = true
                    self.assetWriter!.addInput(self.audioAssetWriterInput)
                }
            }
  録画したサンプリングデータの追記は、以下のコードで呼び出すだけだ。
                if captureOutput == self.videoDataOutput {
                    self.videoAssetWriterInput!.appendSampleBuffer(sampleBuffer)
                }
                else if captureOutput == self.audioDataOutput {
                    self.audioAssetWriterInput!.appendSampleBuffer(sampleBuffer)
                }
終了処理で書き込んだ動画ファイルをアルバムに保存している。
            captureSession.stopRunning()
            self.assetWriter?.finishWritingWithCompletionHandler({() -> Void in
                self.assetWriter = nil
                let assetsLib = ALAssetsLibrary()
                assetsLib.writeVideoAtPathToSavedPhotosAlbum(NSURL(fileURLWithPath: self.outputFilePath!), completionBlock: {(assetURL: NSURL!, error: NSError!) -> Void in
                })
            })