はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】NAudioを導入して、WAVEファイルをMP3ファイルに変換する(Windowsのみ動作確認,Macではダメだった)

はじめに

今回はNAudioというライブラリを導入して.wavから.mp3に変換したいと思います。

また先に結論を言うと、WindowsではできましたがMacでは(私の調べた範囲で)できていません。

NAudioとは

NAudio is an open source audio API for .NET written in C# by Mark Heath, with contributions from many other developers. It is intended to provide a comprehensive set of useful utility classes from which you can construct your own audio application.

GitHub - naudio/NAudio: Audio and MIDI library for .NET

// DeepL翻訳
NAudio は、Mark Heath によって C# で書かれた .NET 用のオープン ソース オーディオ API で、他の多くの開発者からの貢献があります。これは、独自のオーディオアプリケーションを構築できる便利なユーティリティクラスの包括的なセットを提供することを目的としています。

環境

Unity 2021.3.7f1
NAudio v2.1.0

インストール

依存パッケージが多いので、かなりメンドクサイです。
NuGet for UnityNuGet importer for UnityというNuGetパッケージをインストールするエディタ拡張を利用してみたのですが、どちらもちゃんとインポートできなかったのでnuget.orgから手動でダウンロードしていきました。
NuGet Gallery | Home

必要になった依存先含むライブラリは以下の通り。

  • NAudio v2.1.0 (net472)
  • NAudio.Core v2.1.0 (netstandard2.0)
  • NAudio.Wasapi v2.1.0 (netstandard2.0)
  • NAudio.WinMM v2.1.0 (netstandard2.0)

nuget.orgからのダウンロードの仕方が分からない人のために一応やり方を説明しておきます。

  1. サイトの右側にあるDownload packageを選択しダウンロード
  2. 拡張子を.zipに変換して解凍
  3. libの中にある対象フレームワークの.dllをインポート

今回は(プラットフォーム依存の)ネイティブプラグインがないのでlibの中身だけでOKなことに注意してください。

またnuget.orgDependenciesにはNAudio.MidiとかNAudio.WinFormsとかもありましたが、なくても今回の使い方では支障はありませんでした。
(厳密には今回の使い方ではNAudio.dllを利用しているわけではなく、NAudio.Core.dllNAudio.Wasapi.dllを利用しているためこの二つさえあれば多分大丈夫なのかも?)

というかWin〇〇の名前からして、Windowsでしか動かないような・・・・・・。(要検証)

WAVからMP3に変換する

Windowsで試します。

公式ドキュメントにも記載があります。
NAudio/MediaFoundationEncoder.md at master · naudio/NAudio · GitHub

private void Start()
{
    // StreamingAssets内にあるWAVファイルへのパス
    var wavFilePath = Path.Combine(Application.streamingAssetsPath, "SampleWAV.wav");

    // mp3の出力先のパス
    var mp3FilePath = Path.Combine(Application.streamingAssetsPath, "SampleMP3.mp3");

    // WaveFileReader(Steamの派生クラス)でWavファイルを読み込む
    using (var reader = new WaveFileReader(wavFilePath))
    {
        try
        {
            // MP3を書き出す
            MediaFoundationEncoder.EncodeToMp3(reader, mp3FilePath);
        }
        catch (InvalidOperationException ex)
        {
            // 利用可能なmp3エンコーダーがない場合は例外を投げる
            Debug.LogError(ex.Message);
        }
    }
}

コメントにも書きましたが、WaveFileReaderSteamの派生クラスで、イメージとしてはSystem.IO.FileStreamみたいなものですね。

コードとしてはかなりシンプルだと思います。

Windows(おそらく8以降?)ではmp3エンコーダーが実装されているので問題なく動きますが、他のプラットフォームだとどれくらい対応しているかは要検証です。

Windows 8 came with an MP3 encoder. So we can also convert our WAV file to MP3. This time, let's catch the exception if there isn't an available encoder:

NAudio/MediaFoundationEncoder.md at master · naudio/NAudio · GitHub

Windows 8には、MP3エンコーダーが搭載されています。ですから、WAVファイルをMP3に変換することも可能です。今回は、利用可能なエンコーダがない場合の例外を捕らえましょう。

Macで動くか検証してみる

Macでも同じコードを動かしてみると、以下のエラーがでてきました。

DllNotFoundException: mf.dll assembly: type: member:(null)
NAudio.Wave.MediaFoundationEncoder.GetOutputMediaTypes (System.Guid audioSubtype) (at :0)
NAudio.Wave.MediaFoundationEncoder.SelectMediaType (System.Guid audioSubtype, NAudio.Wave.WaveFormat inputFormat, System.Int32 desiredBitRate) (at :0)
NAudio.Wave.MediaFoundationEncoder.EncodeToMp3 (NAudio.Wave.IWaveProvider inputProvider, System.String outputFile, System.Int32 desiredBitRate) (at :0)
Test.Start () (at Assets/Scripts/Test.cs:22)

DllNotFontExceptionということでもしかすると何かしらの追加.dllを入れたり、何かしらの操作をすれば可能かもしれませんが、私はまだ見つけられていません。

補足

ネットで検索していると、UnityNAudioを使おうとするとたまにクラッシュするとの情報が多々ありました。
要注意してください。