【WinForms】複数の音源を同時に鳴らす
WinFormsアプリケーションで2つの音源を同時に再生したい場合、System.Media.MediaPlayer
クラスや NAudio
ライブラリなどを使用する方法があります。System.Media.
はシンプルな使い方を提供しますが、より高度な操作が必要な場合は MediaPlayer
NAudio
が適しています。以下に、それぞれの方法で2つの音源を同時に再生する例を示します。
MediaPlayer (System.Windows.Media.MediaPlayer)
MediaPlayer は、WPF(Windows Presentation Foundation)アプリケーション向けに設計された、よりハイレベルなオーディオおよびビデオ再生機能を提供するクラスです。MediaPlayerは主にメディアファイルの簡単な再生に焦点を当てており、UIと密接に統合されたアプリケーションでの使用を意図しています。MediaPlayerの特徴は以下の通りです:
- 簡単なメディア再生: オーディオおよびビデオファイルの再生を簡単に行うことができます。
- WPFとの統合: WPFアプリケーションに容易に組み込むことができ、XAMLと連携してメディアコンテンツの表示や制御を行います。
- ハイレベルAPI:
MediaPlayer
は使用が簡単なハイレベルAPIを提供しており、複雑な設定やオーディオ処理の知識がなくても使用できます。
サンプル
プロジェクトファイルのアプリケーション登録の追加
一部のエディションの Windows(例えば、Windows 10 N および KN エディション)では、Windows Media Player および関連するメディア機能が標準で含まれていません。これらのエディションを使用している場合、メディア関連の機能を使用するには、"Media Feature Pack" を別途ダウンロードしてインストールする必要があります。このパックには、WMF のコンポーネントも含まれており、WPF アプリケーションでのメディア再生機能などが正しく動作するようになります。
ソリューションエクスプローラから、該当プロジェクトを選択し、プロジェクトのプロパティで、WPF(Windows Presentation Foundation)を有効にします
デザイン
1.wav、2.wavファイルともビルド時に実行フォルダにコピーされるようにしておく
コード
using System.Windows.Media;
namespace MediaPlayerApp
{
public partial class Form1 : Form
{
private MediaPlayer player1;
private MediaPlayer player2;
public Form1()
{
InitializeComponent();
// MediaPlayer インスタンスの初期化
player1 = new MediaPlayer();
player2 = new MediaPlayer();
// オーディオファイルのパスを指定
player1.Open(new Uri("1.wav", UriKind.Relative));
player2.Open(new Uri("2.wav", UriKind.Relative));
}
// button1 (Play Player 1) のクリックイベントハンドラ
private void button1_Click(object sender, EventArgs e)
{
player1.Play();
}
// button2 (Stop Player 1) のクリックイベントハンドラ
private void button2_Click(object sender, EventArgs e)
{
player1.Stop();
}
// button3 (Play Player 2) のクリックイベントハンドラ
private void button3_Click(object sender, EventArgs e)
{
player2.Play();
}
// button4 (Stop Player 2) のクリックイベントハンドラ
private void button4_Click(object sender, EventArgs e)
{
player2.Stop();
}
}
}
NAudio
ライブラリ
サンプル
依存関係の追加
NuGetからNAudioをインストールします
NAudioライブラリを使用して、指定された機能(MediaPlayerを使用して2つの異なるオーディオファイルを管理し、それぞれの再生と停止をボタンクリックで制御する)を実装するためのコード例を以下に示します。この例では、WaveOutEvent
クラスをオーディオ出力デバイスとして、AudioFileReader
クラスをオーディオファイルの読み込みに使用します。
まず、プロジェクトにNAudioパッケージを追加する必要があります。これは、NuGetパッケージマネージャを通じて行うことができます。
デザイン
1.wav、2.wavファイルともビルド時に実行フォルダにコピーされるようにしておく
コード
using NAudio.Wave; // NAudioの名前空間を使用
namespace MediaPlayerApp
{
public partial class Form1 : Form
{
private WaveOutEvent outputDevice1;
private AudioFileReader audioFile1;
private WaveOutEvent outputDevice2;
private AudioFileReader audioFile2;
public Form1()
{
InitializeComponent();
// オーディオファイルの初期化
audioFile1 = new AudioFileReader("1.wav");
audioFile2 = new AudioFileReader("2.wav");
// 出力デバイスの初期化
outputDevice1 = new WaveOutEvent();
outputDevice2 = new WaveOutEvent();
}
private void button1_Click(object sender, EventArgs e)
{
// プレイヤー1の再生
if (outputDevice1.PlaybackState != PlaybackState.Playing)
{
outputDevice1.Init(audioFile1);
outputDevice1.Play();
}
}
private void button2_Click(object sender, EventArgs e)
{
// プレイヤー1の停止
outputDevice1.Stop();
}
private void button3_Click(object sender, EventArgs e)
{
// プレイヤー2の再生
if (outputDevice2.PlaybackState != PlaybackState.Playing)
{
outputDevice2.Init(audioFile2);
outputDevice2.Play();
}
}
private void button4_Click(object sender, EventArgs e)
{
// プレイヤー2の停止
outputDevice2.Stop();
}
}
}
このコードスニペットは、Form1
クラス内で WaveOutEvent
と AudioFileReader
インスタンスを使用して2つのオーディオファイルを制御する方法を示しています。button1
と button3
はそれぞれ player1
と player2
の再生を開始し、button2
と button4
はそれぞれの停止を制御します。
注意点として、OutputDevice.Stop
メソッドを呼び出した後、再度同じ AudioFileReader
インスタンスで再生を開始する場合、AudioFileReader.Position
プロパティを 0 に設定してオーディオファイルの再生位置をリセットする必要があるかもしれません(再生を最初から開始したい場合)。この例では、再生が既に進行中でない場合にのみ再生を開始するように制御しているため、その部分は省略しています。
どちらを使うか
MediaPlayerの利用を選択する理由:
- 簡単な実装:
MediaPlayer
は使用が簡単で、数行のコードでメディアの再生を開始できます。特に、WPFアプリケーションでの使用が想定されています。 - UIとの統合: WPFやUWPなどのUIフレームワークと統合されているため、ビデオの再生やビジュアルエフェクトの実装が容易です。
- マルチメディアフォーマットのサポート: 様々なオーディオとビデオフォーマットのサポートが組み込まれています。
NAudioの利用を選択する理由:
- 高度なオーディオ処理機能:
NAudio
はオーディオ録音、加工、解析などの高度な機能を提供します。複雑なオーディオ処理が必要なアプリケーションに適しています。 - 低レベルAPIへのアクセス: DirectSound、WASAPI、ASIOなど、低レベルのオーディオAPIへのアクセスが可能です。これにより、より詳細なオーディオ制御が可能になります。
- カスタマイズ性:
NAudio
を使用すると、オーディオデータのカスタム処理が可能になります。例えば、オーディオフィルタリング、エフェクトの適用、オーディオデータの解析などが行えます。
ディスカッション
コメント一覧
まだ、コメントがありません