どうも、フリーランスのITエンジニア兼ブロガー兼投資家のKerubitoです。
Swiftで「録音&再生」アプリを作ってみました。
環境は以下の通りです。
・Swiftバージョン:5
・Xcodeバージョン:11.4
・使用デバイス:iPhone8(13.2.2)
必要最低限&最速で「Swiftで録音機能」を試したいという場合に役立つと思います。
プロジェクトを作成するところから動作確認まで小一時間ぐらいですので、エラーハンドリングなどは何もしてません。
本当にただ繋げただけ。
あと、SwiftUIで画面作ってますが、そこもかなり適当なのであしからず。
プロジェクトの作成
Xcodeを立ち上げ、「Create a new Xcode project」をクリックします。
次はプロジェクトのタイプを選択します。
「Single View Application」をクリックします。
あとはアプリやデベロッパーの名称、言語、対象デバイスを設定します。
AudioRecorderクラスを用意
録音と再生を担うクラス、メインの処理をまずは用意します。
それぞれメソッド単位で説明していきます。
まずはrecord()、録音を担当。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | internal func record() { let session = AVAudioSession.sharedInstance() try! session.setCategory(AVAudioSession.Category.playAndRecord) try! session.setActive(true) let settings = [ AVFormatIDKey: Int(kAudioFormatMPEG4AAC), AVSampleRateKey: 44100, AVNumberOfChannelsKey: 2, AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue ] audioRecorder = try! AVAudioRecorder(url: getURL(), settings: settings) audioRecorder.record() } |
セッション、設定といった前準備から、実際の録音までをここでやります。
下から2行目にてgetURL()を読んでいますが、本体はこちら。
1 2 3 | private func getURL() -> URL{ return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("sound.m4a") } |
ドキュメント直下に「sound.m4a」として録音データをファイルにて保存しています。
m4aはAAC形式の拡張子です。
録音の停止は以下のメソッドです。
1 2 3 4 5 | internal func recordStop() -> Data?{ audioRecorder.stop() let data = try? Data(contentsOf: getURL()) return data } |
ファイルからバイナリにして戻しているんですが、ここでは余計な処理でしたので無視してください。
録音した音声を再生します。
1 2 3 4 5 | internal func play() { audioPlayer = try! AVAudioPlayer(contentsOf: getURL()) audioPlayer.volume = 10.0 audioPlayer.play() } |
audioPlayer.volume = 10.0とボリュームを設定しているのですが、なぜかこれがないと音が小さいので入れています。
ただ、あまり調べずに適当にやっているので、ちゃんと実装するときはこのまま使わないほうがいいです。
再生停止。
1 2 3 | internal func playStop() { audioPlayer.stop() } |
上のもろもろをまとめたAudioRecorderクラスです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | import AVFoundation class AudioRecorder { private var audioRecorder: AVAudioRecorder! internal var audioPlayer: AVAudioPlayer! internal func record() { let session = AVAudioSession.sharedInstance() try! session.setCategory(AVAudioSession.Category.playAndRecord) try! session.setActive(true) let settings = [ AVFormatIDKey: Int(kAudioFormatMPEG4AAC), AVSampleRateKey: 44100, AVNumberOfChannelsKey: 2, AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue ] audioRecorder = try! AVAudioRecorder(url: getURL(), settings: settings) audioRecorder.record() } internal func recordStop() -> Data?{ audioRecorder.stop() let data = try? Data(contentsOf: getURL()) return data } internal func play() { audioPlayer = try! AVAudioPlayer(contentsOf: getURL()) audioPlayer.volume = 10.0 audioPlayer.play() } internal func playStop() { audioPlayer.stop() } private func getURL() -> URL{ return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("sound.m4a") } } |
画面側の実装はSwiftUI
今度は録音機能を呼び出す画面側です。
こっちは本当に適当。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | struct ContentView: View { let audioRecorder: AudioRecorder = AudioRecorder() @State var isRecording = false var body: some View { VStack { Button("録音開始") { self.audioRecorder.record() } .padding(.bottom, 10.0) Button("録音停止") { _ = self.audioRecorder.recordStop() } .padding(.bottom, 10.0) Button("再生開始") { self.audioRecorder.play() } .padding(.bottom, 10.0) Button("再生停止") { self.audioRecorder.playStop() } } } } |
こんな感じのものが動きます。
注意点として、新規でアプリを作る場合は「マイク」の許可を承諾する設定をplistに追加する必要があります。
NSMicrophoneUsageDescriptionです。
上の環境でビルドは通して、それぞれ動くぐらいの確認はしましたので、録音機能を試すぐらいはできるかと。
ソースはGitHubに上げています。
楽しい開発ライフを!