6月が過ぎ去った。
アプリ開発、6月の計画というか方針 | nackpan Blog
6月中にやりたかったこと
・「語学学習支援プレイヤー」のアップデート
・再生速度変更機能の追加
・バックグラウンド再生機能の追加
・オーディオファイルを無音部分で分割するアプリを製作する
・・・しかし、どちらも完成しなかった。・・・残念。
「語学学習支援プレイヤー」のアップデートのほうは、必要な機能(再生速度変更、アイテムに無音部分を付与、バックグラウンドで複数アイテム再生、無音位置配列の保存、オーディオファイルの照合)をそれぞれ実験してきちんと動くことまで確認できた。あとは、本体に統合しましょう。
無音分割のほうは、全然手をつけられませんでした。
思ってたより、ずいぶんと時間がかかっております。
再生速度の変更
再生速度の変更は、AVPlayerにrateプロパティがあるので、これを使えばすぐにできるだろうと考えていた。
やってみた。rate=0.5。「こんにちは」をスローで再生。
「ここんんににちちはは」
みたいな、たいそうぼわぼわした音になった。
困った。
青木直史「サウンドプログラミング入門」を買ってきた。
「音の高さを変化させずに音の高さを自由にコントロールするテクニックが、タイムストレッチです。」
スロー再生とかで行っている処理は、タイムストレッチというのか。
波の周期を求めて、縮めたり引き延ばしたりする。なかなか大変そうだね。
タイムストレッチで調べたら、Dirac 3というライブラリがあった。
これ使おうか、と思っていたとき。
この段階で、あらためてAV Foundationフレームワーク関連のreferenceを見てみると、
AVAudioMixInputParameters Class Reference にaudioTimePitchAlgorithmというプロパティがあって、再生速度を変更する際のアルゴリズムを指定できるとある。声に適しているのは、AVAudioTimePitchAlgorithmTimeDomain。
AVMutableAudioMixInputParameters *mixParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTrack]; // for voice mixParameters.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithmTimeDomain; AVMutableAudioMix* audioMix = [AVMutableAudioMix audioMix]; audioMix.inputParameters = @[mixParameters]; AVPlayerItem* playerItem = [AVPlayerItem playerItemWithAsset:composition]; playerItem.audioMix = audioMix;
こんな感じでやってみたら、声の再生が「こ〜ん〜に〜ち〜は〜」という期待していた音になった。よかった。
バックグラウンド再生
そんで、バックグラウンド再生。
iOSでは、バックグラウンドでできることは限定されてるけど、オーディオ再生はできる。
オーディオ再生はいいのだけれど、止めて適宜時間を測ってまた再生するという部分がバックグラウンドでできない。
それで、当初MPMediaPlayerController使ってたときはバックグラウンド再生には対応していなかった。
で、語学学習支援プレイヤーver1.3.0からは、AVPlayerを使っている。
AV Foundation Programming Guide: About AV Foundation
AV Foundation プログラミングガイド (日本語)(PDF)
ここのプログラミングガイド、assetの編集に関する部分で、assetを切ったり複数のassetをくっつけたりしてできたものをassetとして扱えるとある。ということは、assetに適切な長さの無音部分をくっつけて新たなassetを作ってそれを連続再生するという形にすれば、「語学学習支援プレイヤー」でもバックグラウンドでの連続再生ができるんじゃないかなと考えた。
やってみた。うまくいった。よかった。
無音位置配列の保存
これまでは、曲を選択すると毎回オーディオファイルの無音位置を調べていた。
多数のファイル、長い時間のファイルだと調べ終わるまで時間がかかっている。
しかし、バックグラウンド再生ができるようにしたばあい、アプリを起動して再生開始した後、すぐにバックグラウンドへ移行するケースが考えられる。まだ無音位置がわかっていないうちにバックグラウンドへ移行すると、期待通りの再生ができない。
そのため、できるだけはやく無音位置がわかるようにしたい。
そこで、あらかじめ無音位置配列を保存しておいて、それが使える場合は使うようにする。
この辺りの処理を行うのにCore Dataを使うことにした。
参考書。
國井貴浩「iOS Core Data徹底入門」
以前、半分ぐらい、いよいよCoreDataが登場するところまで読み進めていた。
データ永続化について順々に説きすすめていく本。バイナリで読み書き。NSUserDefaultで読み書き。NSDictionaryを使ったXMLファイルを読み書き。SQLiteを使用。CoreDataを使用。と、すすめていく。各方式にどのような特徴があるのかを示す。
今回の用途では、Core Dataの一部分の機能を使えばよさそう。
ということで、無音位置保存機能と照合機能を作った。
今後の展望
必要な機能はそろったので、「語学学習支援プレイヤー」に組み込んで行こう。
「2014年6月進捗状況」への2件のフィードバック