今回は、現在Google Play Storeで公開中のスマホアプリ「Sound Effect Player」に追加した、録音機能の実装方法について覚書として残しておく
〇概要
このアプリでの録音機能について一応簡単に触れておく
このアプリにはタップして音を鳴らすためのボタン(音楽機材のサンプラー的にPadと呼んでいる)が複数あり、それぞれのPadに音声ファイルを登録して鳴らすような仕様となっている
その中で、自分でスマホで録音してWavファイルとしてスマホ内に保存して、これをPadに登録して鳴らすことも可能にしている
ということで・・・・・(あれ、前置きいらんかったかも)
①スマホでの録音
➁Wavファイルとして保存
までを書き残しておく
流れとしては、
・Microphoneクラスを使用
・使えるデバイスの検索
・Start関数で録音開始 AudioClipとして記憶
・End関数で録音終了
・AudioClipをWav形式のファイルとして保続
①スマホでの録音
コード全体//////////////////////////////////////////////////////////////////////////////////
using UnityEngine;
AudioClip SamplingClip;
//まずは使用可能なデバイスを検索
if (Microphone.devices.Length == 0)
{
return;
}
//いくつか列挙される場合もあるが、主に使われる(?)一番目のデバイス名を取得
string mic = Microphone.devices[0];
//録音中かどうかにより、処理を分岐
//アプリの操作の流れ的には、録音ファイルを登録するPadをタップして録音開始する
if (!isRecording)
{
//録音中でない場合は録音開始
SamplingClip = Microphone.Start(mic, false, 10, 44100);
if (SamplingClip) {
isRecording = true;
CurrentFileLabel.text = "録音中"; //状態の表示を更新
}
}
//録音中にPadが押された場合
else {
//録音終了
Microphone.End(mic);
if (SamplingClip == null)
{
CurrentFileLabel.text = "録音失敗";
}
else {
//AudioClipがnullでない場合はWav形式でファイルを保存
SaveWavFile();
isRecording = false;
}
}/////////////////////////////////////////////////////////////////////////////////////////
〇Microphoneクラス 使用関数
//デバイスの検索
public static string devices ;
//録音開始
public static AudioClip Microphone.Start (string deviceName, bool loop, int lengthSec, int frequency);
deviceName デバイス名
loop
ループ録音を行なうかどうか、行なう場合は lengthSec に到達したときにクリップの最初に戻って録音を継続する
lengthSec 録音するオーディオクリップの長さ
frequency 録音するオーディオクリップの周波数
//録音終了
End (string deviceName);
➁Wavファイルとして保存
流れとしては
・ファイル名を入力するダイアログを表示
・ファイル名が入力されてOKボタンが押されたら、ファイルを保存
//ファイル名を入力するダイアログを表示
public void SaveWavFile()
{
FileBrowser.SetDefaultFilter(".wav");
FileBrowser.ShowSaveDialog(OnSaveSuccess, OnSaveCancel, false, false, null,
"Save", "Save");
}
ファイルダイアログについては、フリーのアセットを使用させてもらっているので、下記を参照
//ファイル名が入力されてOKボタンが押された場合の処理
void OnSaveSuccess(string paths)
{
//ファイルダイアログで入力したファイル名と、アプリの保存されているパスを
合成して保存先のパスを生成
string destpath =
Application.persistentDataPath+"/"+FileBrowserHelpers.GetFilename(paths[0]);
//保存先とAudioClipを渡してWavファイル保存処理へ
if (!SavWav.Save(destpath, SamplingClip))
CurrentFileLabel.text = "音声ファイルの保存失敗";
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
}
なお、AudioClipをWavファイル形式で保存するコードは、「darktable」さんの「SavWav.cs」を使用させてもらったのと、中身はよくわからないので・・・(-_-メ)
Unity3D: script to save an AudioClip as a .wav file. · GitHub
◆Androidのファイルの保存について
現状Google Play StoreにアップロードできるアプリのAPIレベルは29以上になってしまい、以前のように自由にファイルブラウザでアクセスするというようなことはできなくなってしまったので、この点非常に面倒になってしまった
セキュリティの問題とか・・・・
なので、スマホにファイルを保存するには、許可されたフォルダにしかできない
ということで、「 Application.persistentDataPath」というアプリ自体が保存されるパスを取得してきてその中に保存するという形でwavファイルを保存している
このやり方が正解かも正直よくわからないが・・・・<m(__)m>
今回は以上