はじめに
今回は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 Unity
やNuGet 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
からのダウンロードの仕方が分からない人のために一応やり方を説明しておきます。
- サイトの右側にある
Download package
を選択しダウンロード - 拡張子を
.zip
に変換して解凍 lib
の中にある対象フレームワークの.dll
をインポート
今回は(プラットフォーム依存の)ネイティブプラグインがないのでlib
の中身だけでOKなことに注意してください。
またnuget.org
のDependencies
にはNAudio.Midi
とかNAudio.WinForms
とかもありましたが、なくても今回の使い方では支障はありませんでした。
(厳密には今回の使い方ではNAudio.dll
を利用しているわけではなく、NAudio.Core.dll
とNAudio.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); } } }
コメントにも書きましたが、WaveFileReader
はSteam
の派生クラスで、イメージとしては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
を入れたり、何かしらの操作をすれば可能かもしれませんが、私はまだ見つけられていません。
補足
ネットで検索していると、Unity
でNAudio
を使おうとするとたまにクラッシュするとの情報が多々ありました。
要注意してください。