録音している時の音量を可視化するAudioMeterViewを作った

AudioMeterViewというライブラリを作りました。

AudioMeterViewを使うと、録音している時の音量をプログレスバー形式で表示することができます。

上のgifアニメのコードは以下のようになります。


import UIKit
import AVFoundation

class ViewController: UIViewController,AVAudioRecorderDelegate {
    @IBOutlet var audioMeterView: AudioMeterView! = AudioMeterView()
    var timer:NSTimer!
    var loaded:Bool = false
    var fname:String!
    var currentPath:NSURL!
    var soundRecorder:AVAudioRecorder!


    override func viewDidLoad() {
        super.viewDidLoad()
        self.setupRecorder()
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        if self.loaded == false {
            // setup audiometerView  
            self.audioMeterView.setup(0.4, backgroundColor: UIColor.lightGrayColor(), overLayColor: UIColor.redColor())
        }
    }

    func record(path:NSURL){
        let audioSession:AVAudioSession = AVAudioSession.sharedInstance()
        try! audioSession.setCategory(AVAudioSessionCategoryRecord)
        try! audioSession.setActive(true)
    }


    func setupRecorder(){
        self.fname = NSUUID().UUIDString + ".caf"
        let documentDirectoryURL = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
        let fileDestinationUrl = NSURL(string: documentDirectoryURL)!.URLByAppendingPathComponent(fname)
        self.currentPath = fileDestinationUrl
        self.record(self.currentPath)

        let recordSettings:[String:AnyObject] = [
            AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
            AVEncoderAudioQualityKey: AVAudioQuality.Max.rawValue,
            AVEncoderBitRateKey: 320000,
            AVNumberOfChannelsKey: 2,
            AVSampleRateKey: 44100.0
        ]


        self.soundRecorder = try! AVAudioRecorder(URL: self.currentPath, settings: recordSettings)
        self.soundRecorder.updateMeters()
        self.soundRecorder.delegate = self
        self.soundRecorder.prepareToRecord()
        self.soundRecorder.meteringEnabled = true


    }





    @IBAction func onToggleRecord(button: UIButton) {
        // Record/Stopボタンが押された時の挙動
        if button.titleLabel!.text == "Record" {
            button.setTitle("Stop", forState: .Normal)
            self.timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "updated", userInfo: nil, repeats: true)
            self.soundRecorder.record()
        }else{
            button.setTitle("Record", forState: .Normal)
            self.soundRecorder.stop()
            self.timer.invalidate()
        }




    }


    func updated(){
        //0.4秒ごとに音量を取得してself.audioMeterViewに反映させる
        self.audioMeterView.updateRecorderMeter(self.soundRecorder, duration: 0.4, channel: 0)
    }


AudioMeterViewのGitHubのリンクからサンプルプロジェクトをダウンロードできます。

Related Contents

Pickup Contents