iOSアプリエンジニアの@hiragramです。普段は美容情報アプリVICOLLEを作っています。
先日のSpeeeKaigiで"複数人でpodcastを収録するための便利アプリを作ってみた"という発表をしました。
最近いろいろ新しいpodcastが出てきて、参入障壁が下がっていることは良いことだと思うんですが、音質が悪いとか、高音が耳にキツいとか、そういう問題が多いように感じていました。また、複数人で収録するとなると、Skypeでまとめて録音するのか、各々が録音したものを誰かが編集するのか、後者だとしたらそれってどうやるのか、といった問題が発生するでしょう。
そこで、録音からミックスまで簡単に行えるMacアプリを作って発表してみました。
AudioToolboxで録音するに当たって登場したSwiftのポインタの話
マイクからオーディオを録音する所にはAudioToolboxを使いました。
AudioToolboxのAPIはポインタを介してデータをやり取りするものが多いです。今回はじめてSwiftでポインタを扱ったのでまとめました。
UnsafeMutablePointer
- 多分一番やばいポインタ ポインタが指すデータの型なし(untyped)
- 名前にやばそうな単語が多すぎ
- どっか間違えてもBAD_ACCESSと言われるだけなことがおおい、デバッグ手がかりなし
OpaquePointer
- Swiftの世界に出てこれないCのやばい構造体を扱うためのラッパーっぽい
- これもまたデータ型なし(untyped)
UnsafePointer / UnsafeMutablePointer
- やっと型が!
UnsafePointer<Pointee>
- pointeeプロパティから対象のオブジェクトにアクセスできる
- 型があるだけで安心感がすごい
AVFoundationでミックスダウン
このアプリでは、録音ボタンを押すタイミングを補正するために、ボタンを押した時刻のタイムスタンプを音声データと一緒に保存しています。
よって、複数の録音データをタイムスタンプに応じてずらしてミックスダウンする必要があります。
処理の流れとしては、
- info.plistからタイムスタンプを読み込む
- 一番最初に録音開始した音源を基準に、差の分だけずらしながらオーディオトラックを作る
- AVMutableCompositionをつかって1トラックにまとめる
- AVAssetExportSessionをつかってm4aファイルにエクスポート
所感
Macアプリ + 音声処理というあまり情報がない分野に取り組んでみました。 作成したアプリはコードを公開しているので、もうちょっとコードきれいにしたら使ってみてくださいという気持ちです。