【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を提供しており、複雑な設定やオーディオ処理の知識がなくても使用できます。

サンプル

プロジェクトファイルのアプリケーション登録の追加

WiindowsOSバージョンによる注意

一部のエディションの 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 クラス内で WaveOutEventAudioFileReader インスタンスを使用して2つのオーディオファイルを制御する方法を示しています。button1button3 はそれぞれ player1player2 の再生を開始し、button2button4 はそれぞれの停止を制御します。

注意点として、OutputDevice.Stop メソッドを呼び出した後、再度同じ AudioFileReader インスタンスで再生を開始する場合、AudioFileReader.Position プロパティを 0 に設定してオーディオファイルの再生位置をリセットする必要があるかもしれません(再生を最初から開始したい場合)。この例では、再生が既に進行中でない場合にのみ再生を開始するように制御しているため、その部分は省略しています。

どちらを使うか

MediaPlayerの利用を選択する理由:

  1. 簡単な実装: MediaPlayer は使用が簡単で、数行のコードでメディアの再生を開始できます。特に、WPFアプリケーションでの使用が想定されています。
  2. UIとの統合: WPFやUWPなどのUIフレームワークと統合されているため、ビデオの再生やビジュアルエフェクトの実装が容易です。
  3. マルチメディアフォーマットのサポート: 様々なオーディオとビデオフォーマットのサポートが組み込まれています。

NAudioの利用を選択する理由:

  1. 高度なオーディオ処理機能: NAudio はオーディオ録音、加工、解析などの高度な機能を提供します。複雑なオーディオ処理が必要なアプリケーションに適しています。
  2. 低レベルAPIへのアクセス: DirectSound、WASAPI、ASIOなど、低レベルのオーディオAPIへのアクセスが可能です。これにより、より詳細なオーディオ制御が可能になります。
  3. カスタマイズ性: NAudio を使用すると、オーディオデータのカスタム処理が可能になります。例えば、オーディオフィルタリング、エフェクトの適用、オーディオデータの解析などが行えます。