NAudio を使ったWAVファイルの制御

NAudio を利用すると、WAVファイルの再生時間の取得や再生回数の制御が可能です。


NAudio のインストール

NAudio を使用するには、NuGet からインストールする必要があります。

NuGet からインストール

Install-Package NAudio

Visual Studio の「NuGet パッケージ マネージャー」から NAudio を検索してインストールすることもできます。


1. WAVファイルの再生時間を取得

using System;
using NAudio.Wave;

class Program
{
    static void Main()
    {
        using (var reader = new AudioFileReader("test.wav"))
        {
            TimeSpan duration = reader.TotalTime;
            Console.WriteLine($"再生時間: {duration.TotalSeconds} 秒");
        }
    }
}

ポイント

  • reader.TotalTime音声ファイルの再生時間を取得

2. WAVファイルを再生

using System;
using NAudio.Wave;

class Program
{
    static void Main()
    {
        using (var audioFile = new AudioFileReader("test.wav"))
        using (var outputDevice = new WaveOutEvent())
        {
            outputDevice.Init(audioFile);
            outputDevice.Play();

            Console.WriteLine("再生中... Enterキーで終了");
            Console.ReadLine(); // ユーザーがEnterを押すまで再生
        }
    }
}

ポイント

  • WaveOutEvent を使用してWAVを再生。
  • Console.ReadLine();プログラムが即終了しないようにする

3. 再生回数を指定して再生

方法1: ループを使う

using System;
using NAudio.Wave;

class Program
{
    static void Main()
    {
        string filePath = "test.wav";
        int repeatCount = 3; // 再生回数

        for (int i = 0; i < repeatCount; i++)
        {
            using (var audioFile = new AudioFileReader(filePath))
            using (var outputDevice = new WaveOutEvent())
            {
                outputDevice.Init(audioFile);
                outputDevice.Play();

                // 再生が終わるまで待つ
                while (outputDevice.PlaybackState == PlaybackState.Playing)
                {
                    System.Threading.Thread.Sleep(100);
                }
            }
        }
    }
}

ポイント

  • for ループを使い 指定回数だけ再生
  • while (outputDevice.PlaybackState == PlaybackState.Playing)再生が終わるまで待機

方法2: PlaybackStopped イベントを使う

using System;
using NAudio.Wave;

class Program
{
    private static int playCount = 0;
    private static int maxPlayCount = 3; // 再生回数
    private static WaveOutEvent outputDevice;
    private static AudioFileReader audioFile;

    static void Main()
    {
        PlayAudio("test.wav");

        // 再生が終わるまで待機
        Console.WriteLine("Enterキーで終了");
        Console.ReadLine();
    }

    static void PlayAudio(string filePath)
    {
        if (playCount < maxPlayCount)
        {
            playCount++;
            Console.WriteLine($"再生 {playCount}/{maxPlayCount}");

            outputDevice = new WaveOutEvent();
            audioFile = new AudioFileReader(filePath);
            outputDevice.Init(audioFile);
            outputDevice.Play();

            // 再生が終了したら次の再生を行う
            outputDevice.PlaybackStopped += (sender, e) =>
            {
                outputDevice.Dispose();
                audioFile.Dispose();

                if (playCount < maxPlayCount)
                {
                    PlayAudio(filePath);
                }
            };
        }
    }
}

ポイント

  • PlaybackStopped イベントを利用して 再生終了後に次の再生を自動で開始
  • playCount をカウントし、指定回数に達したら終了

まとめ

機能方法
WAVファイルの再生WaveOutEvent.Play();
再生時間の取得NAudio.AudioFileReader.TotalTime;
再生回数の指定for ループ or PlaybackStopped イベント
再生開始位置の変更audioFile.CurrentTime = TimeSpan.FromSeconds(x);
一時停止・再開outputDevice.Pause(); / outputDevice.Play();
停止outputDevice.Stop();

どの方法を使うべきか?

用途適した方法
シンプルな再生のみWaveOutEvent を使用
再生時間の取得が必要NAudio.AudioFileReader.TotalTime
再生回数を指定したいfor ループ または PlaybackStopped イベント
.wav 以外のフォーマットも再生したいNAudio

結論

  • 再生回数の指定・再生時間の取得には NAudio が必要
  • PlaybackStopped を使うと綺麗にループできる

NAudio を使うことで、柔軟な音声再生が可能になります!

C#

Posted by hidepon