VoiceRecorder

AVAudioRecorderとAVAudioPlayerへの理解を深めるために作成

<img width="200" alt="ezgif.com-video-to-gif" src="https://qiita-image-store.s3.amazonaws.com/0/302540/9067c5a7-3b8c-8667-1170-0a7354c8ea31.gif">


#ソースコード
RECORDボタンで録音
STOP後にPLAYで再生

```swift:ViewController.swift

import UIKit
import AVFoundation

class ViewController: UIViewController,AVAudioRecorderDelegate, AVAudioPlayerDelegate {//レコーダーと再生処理
    
    @IBOutlet var label: UILabel!
    @IBOutlet var recordButton: UIButton!
    @IBOutlet var playButton: UIButton!
    
    var audioRecorder:AVAudioRecorder!//録音
    var audioPlayer:AVAudioPlayer!//再生
    var isRecording = false //録音状態か判別
    var isPlaying = false//再生状態か判別
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    //録音する処理
    @IBAction func record() {
        if !isRecording {
            
            // 再生と録音の機能をアクティブにする
            let session = AVAudioSession.sharedInstance() //音楽の再生をコントロールすることが可能
            try! AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [])//チャット用にマイク入力と音声出力を行う際に利用
            try! session.setActive(true) //session時にtryが必要？　trueアプリケーションのオーディオセッションを有効にするか　false無効にするかを指定します
            
            //録音フォーマットの設定
            let setteings = [
                AVFormatIDKey:Int(kAudioFormatMPEG4AAC),
                AVSampleRateKey: 44100,
                AVNumberOfChannelsKey: 2,
                AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
            ]
            
            audioRecorder = try! AVAudioRecorder(url: getURL(), settings: setteings)//url記録先のファイルシステムの場所settings録音セッションの設定
            audioRecorder.delegate = self
            
            audioRecorder.record()
            isRecording = true
            
            label.text = "録音中"
            //表示されるテキスト
            recordButton.setTitle("STOP", for: .normal)
            playButton.isEnabled = false
        }else {
            audioRecorder.stop()
            isRecording = false
            
            label.text = "待機中"
            recordButton.setTitle("RECORD", for: .normal)
            playButton.isEnabled = true
        }
    }
    
    
    @IBAction func play() {
        if !isPlaying {
            audioPlayer = try! AVAudioPlayer(contentsOf: getURL())
            audioPlayer.delegate = self
            audioPlayer.play()
            
            isPlaying = true
            
            label.text = "再生中"
            playButton.setTitle("STOP", for: .normal)
            recordButton.isEnabled = false
        }else{
            audioPlayer.stop()
            isPlaying = false
            
            label.text = "待機中"
            playButton.setTitle("PLAY", for: .normal)
            recordButton.isEnabled = true
        }
    }
    
    //再生終了を検知
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        if flag {
            audioPlayer.stop()
            isPlaying = false
            
            label.text = "待機中"
            playButton.setTitle("PLAY", for: .normal)
            recordButton.isEnabled = true
        }
    }
    
    //ディレクトリのファイルURLを取得
    func getURL() -> URL {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) //iPhone内のDocumentディレクトリ(ファイル）を探して、そのパスを取得。
        let docsDirect = paths[0]
        let url = docsDirect.appendingPathComponent("recording.m4a") //m4aで保存
        return url
    }
}
```
#録音フォーマットの設定
info.mDataFormat.mFormatID = kAudioFormatMPEG4AAC
        info.mDataFormat.mSampleRate = 44100.0
        info.mDataFormat.mChannelsPerFrame = 2
        info.mDataFormat.mBitsPerChannel = 0
        info.mDataFormat.mFramesPerPacket = 1024
        info.mDataFormat.mBytesPerFrame = 0
        info.mDataFormat.mBytesPerPacket = 0
        info.mDataFormat.mFormatFlags = 0