
‘NAudio’(リポジトリ)は、.Netフレームワークで使用可能な、音声・音楽再生用のフレームワークです。
今回はこのNAudioを用いて、動画ファイルから音声のみを再生するコードを解説します。
更新履歴
2019/07/07 公開
NAudioをNuGetで導入する
‘NuGet’(解説)は、Visual Studio 2012以降標準で搭載されているパッケージマネージャーです。
NAudioを導入する場合、パッケージ名として「naudio」と入力し、『NAudio』とだけになっているパッケージをインストールします。
インストールに成功すれば、「ソリューションエクスプローラー」の「参照ツリー」に、NAudio
が追加されます。


サンプルコードのダウンロード
サンプルコード

using System;
using System.Windows.Forms;
using NAudio.Wave;
namespace NAudioTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
/* ループでブロッキングするので、予めフォーム描画を強制する */
Show();
Application.DoEvents();
/* 音声プレイヤー、メディアファンデーションリーダーを生成 */
using (var player = new WasapiOut())
using (var reader = new MediaFoundationReader(@"d:\test.mp4"))
{
/* プレイヤーをリーダーで初期化し再生 */
player.Init(reader);
player.Play();
/* フォームを閉じたらプレイヤーを止めるようイベントを定義 */
FormClosed += (cs, ce) => player.Stop();
/* 音声再生位置が最後に到達しておらず、停止されていないならループ */
while (reader.CurrentTime < reader.TotalTime
&& player.PlaybackState != PlaybackState.Stopped)
{
/* 100ミリ秒おきにイベントループを処理させる */
System.Threading.Thread.Sleep(100);
Application.DoEvents();
}
}
}
}
}
サンプルコードの簡単な解説
動画から音声を再生するためには、まず動画ファイルを読み込むためのMediaFoundationReader
をインスタンス化します。
インスタンス化する際に、動画のファイル名をコンストラクタで指定しますが、これは必須になっています。
そして、実際に音声を再生するためにWasapiOut
のインスタンスのplayer.Init(reader);
を用いて読み込んだ音声を指定します。
あとはplayer.Play();
で実際に再生が可能です。
とても簡単ですね。
今回は手間を掛けずに正しく解放動作をさせるために、while
ループを用いて再生状況を監視し、using
ステートメントで自動解放させています。
なお、ブロッキングの解消をApplication.DoEvents();
で行っています。
また、FormClosed
にイベントを定義しており、フォームを閉じたらプレイヤーをplayer.Stop();
で停止させています。
この停止処理によりplayer.PlaybackState
で再生状態を取得するとPlaybackState.Stopped
へ変化します。
これにより、while
ループの条件が成り立たなくなり、ループが終了します。
NAudioのサンプルコードとしては、これぐらいシンプルな構造の方がわかりやすいのではないでしょうか。
NAudioでハイレゾ音源の動画を再生する
‘WASAPI’(わさぴ、Windows Audio Session API、Wikipedia)とは、Windows Vista以降で使用可能な、比較的新しいオーディオ再生APIです。
WASAPIでオーディオを再生する際に「動作モード」を指定可能です。
動作モードには「共有モード」と「排他モード」があります。
この動作モードを「排他モード」にすると、オーディオ出力に他のアプリケーション(OS含む)が介在できなくし、直接的なオーディオ・サンプルの操作を可能にします。
以下のように定義することで、動画をハイレゾ再生できます。
using定義
using NAudio.CoreAudioApi
NAudioでWASAPIを排他モード(ハイレゾ再生可能)にする
using (var player = new WasapiOut(AudioClientShareMode.Exclusive, 100)){~}
AudioClientShareMode.Exclusive
で排他モードにし、第二引数で‘レイテンシー’(遅延時間)を100ミリ秒に設定しています。
最後に
今回は動画から単純に音声をNAudioで再生する方法を解説しました。
これだけなら、『DirectShow』や『DirectShow.Net』などを用いればいいでしょう。
ただし、これらのフレームワークには64bitアプリケーションが開発できないという明確な欠点があります。
NAudioなら64bitアプリケーションも、32bitアプリケーションも、どちらも開発できます。
そして、様々な音声関連の処理が可能になります。
今後本記事が、C#で凝ったメディアプレイヤーや、動画編集ソフト、音楽編集ソフトを開発しようと思っている方の参考になれば幸いです。
コメントを書く