Titaniumで録音した音声をファイルに保存する。

Titaniumは音声の録音も簡単にできます。

デモアプリのKitchenSinkに録音のサンプルコードもあります。
Google Code Archive - Long-term storage for Google Code Project Hosting.

今回は、録音したファイルをファイルに保存する方法を説明します。参考になるのは、上記KitchenSinkのResources/examples/sound_record.jsです。

録音するには、Ti.Media.createAudioRecorder()でAudioRecorderインスタンスを生成して、このインスタンス経由で行うらしい。

// sound_record.js: 2行目
var recording = Ti.Media.createAudioRecorder();

録音の開始は

// sound_record.js: 134行目
recording.start();

そして、終了するときは。

// sound_record.js: 118行目
file = recording.stop();

ここがポイントで、stopの戻り値がファイル(file)を返している。これは、録音したファイルの一時ファイルだと思われる。試しにstop直後にfileの情報を出力してみた。

// file = recording.stop();の直後にログを出してみる
Ti.API.info("Stop recording: " + file);
Ti.API.info("Stop file path: " + file.path);

結果はこんな感じ↓

[INFO] Stop recording: [object TiFile]
[INFO] Stop file path: /var/folders/cq/cqIMj6Y4EEGVkiy42gtsX++++TM/-Tmp-/9CA0.wav

どうやら、stopの戻り値にはTiFileというオブジェクトが返ってきていて、そのオブジェクトのプロパティ(path)を見てみると「/var/folders/cq/cqIMj6Y4EEGVkiy42gtsX++++TM/-Tmp-/9CA0.wav」パスが入っている。つまりこの場所にファイルとして保存されていそう。TiFileがTitanium.Filesystem.File(Appcelerator Platform - Appcelerator Docs)と同じかどうかは不明。
ここ(http://github.com/appcelerator/titanium_mobile/blob/master/iphone/Classes/TiFile.h)を見るとpath, sizeというプロパティとcreateTempFileっていう関数が見えるくらいなので、違うものなんだろうか。微妙。

とりあえず、ここで重要なのはファイルのオブジェクト(TiFileなるもの)が取得できるということ。あとは、これを任意の場所に保存すればよい。ファイルに保存するには、Titanium.Filesystem.getFileでファイルを取得し、取得したFileオブジェクトのwriteで、さっき取得したfile(TiFile)を渡してやるだけでOKだった。手探り感ばりばりみたいな。。

// 保存したいファイルを指定してFileオブジェクトを取得
var f = Titanium.Filesystem.getFile(Titanium.Filesystem.resourcesDirectory + '/' + 'recording_file.wav');
// まだファイルがなければ作成(もしかしたら、この処理はいらないかも)
if (!f.exists()) {
	f.createFile();
}
// writeでファイルを書き込み。
f.write(file);

ちなみに、Titanium.Filesystem.resourcesDirectoryはエミュレータ上では?TitaniumのプロジェクトのResourcesの中みたい。ファイルは以下の場所に保存されていた。iPhoneに乗せたときにはどこにいくんだろう〜。基礎を全く知りません。。

/Users/hironemu/Documents/titanium-workspace/Saikyo-Mezamashi/Resources/record_alerm.wav

ドキュメントもサンプルもそろってなかなかいいんだけど、やっぱり慣れるまでは悪戦苦闘だね。こりゃ。