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
})
})