[C#] WAVファイルの再生時間を取得する方法

C#でWAVファイルの再生時間を取得するには、System.Media.SoundPlayerクラスNAudioライブラリを使用する方法があります。

SoundPlayerクラスは簡単ですが、再生時間を直接取得する機能はありません。

一方、NAudioライブラリを使用すると、AudioFileReaderクラスを利用してWAVファイルの詳細情報を取得できます。

具体的には、AudioFileReaderTotalTimeプロパティを使用することで、再生時間をTimeSpanオブジェクトとして取得できます。

NAudioはNuGetからインストール可能で、音声ファイルの操作に便利です。

この記事でわかること
  • System.Media.SoundPlayerクラスを使用したWAVファイルの基本的な再生方法
  • NAudioライブラリを用いた再生時間の取得とその応用例
  • 複数ファイルの再生時間を一括で取得する方法とフィルタリングの手法
  • 再生時間を表示するGUIアプリケーションの作成方法
  • NAudioとSoundPlayerの違いと、それぞれの使用時の注意点

目次から探す

C#でWAVファイルを扱う方法

C#でWAVファイルを扱う際には、主にSystem.Media.SoundPlayerクラスNAudioライブラリの2つの方法があります。

それぞれの特徴を理解し、適切な方法を選ぶことが重要です。

System.Media.SoundPlayerクラスの概要

System.Media.SoundPlayerクラスは、.NET Frameworkに組み込まれているクラスで、WAVファイルの再生を簡単に行うことができます。

以下にその基本的な特徴を示します。

  • 簡単な使用方法: SoundPlayerクラスは、WAVファイルの再生に特化しており、非常にシンプルなAPIを提供しています。
  • 軽量: 外部ライブラリを必要とせず、.NET Frameworkに組み込まれているため、追加のインストールが不要です。
  • 制限: WAVファイル以外のフォーマットには対応していません。

また、再生時間の取得などの詳細な操作には向いていません。

using System;
using System.Media;
class Program
{
    static void Main()
    {
        // WAVファイルのパスを指定
        string filePath = "example.wav";
        
        // SoundPlayerオブジェクトを作成
        SoundPlayer player = new SoundPlayer(filePath);
        
        // WAVファイルを再生
        player.Play();
        
        Console.WriteLine("WAVファイルを再生中...");
    }
}

このコードを実行すると、指定したWAVファイルが再生されます。

SoundPlayerクラスは非常にシンプルで、再生に特化しています。

NAudioライブラリの概要

NAudioは、C#でオーディオ処理を行うための強力なライブラリです。

WAVファイルの再生だけでなく、さまざまなオーディオフォーマットの操作が可能です。

  • 多機能: WAVファイルの再生だけでなく、MP3やAACなどの他のフォーマットにも対応しています。
  • 詳細な制御: 再生時間の取得や音量調整、オーディオデータの解析など、詳細な操作が可能です。
  • 外部ライブラリ: NuGetからインストールする必要がありますが、その分多機能です。
using System;
using NAudio.Wave;
class Program
{
    static void Main()
    {
        // WAVファイルのパスを指定
        string filePath = "example.wav";
        
        // AudioFileReaderオブジェクトを作成
        using (var audioFile = new AudioFileReader(filePath))
        {
            // WaveOutEventオブジェクトを作成
            using (var outputDevice = new WaveOutEvent())
            {
                // 再生するオーディオを設定
                outputDevice.Init(audioFile);
                
                // WAVファイルを再生
                outputDevice.Play();
                
                Console.WriteLine("WAVファイルを再生中...");
                
                // 再生が終了するまで待機
                while (outputDevice.PlaybackState == PlaybackState.Playing)
                {
                    System.Threading.Thread.Sleep(1000);
                }
            }
        }
    }
}

このコードを実行すると、NAudioを使用してWAVファイルが再生されます。

NAudioは多機能で、再生時間の取得や音量調整なども可能です。

どちらを選ぶべきか

System.Media.SoundPlayerNAudioのどちらを選ぶかは、プロジェクトの要件によります。

以下に選択のポイントを示します。

スクロールできます
特徴System.Media.SoundPlayerNAudio
簡単さ高い中程度
機能性低い高い
対応フォーマットWAVのみ複数フォーマット
外部依存なしあり
  • 簡単さを重視: WAVファイルの再生だけを行いたい場合は、System.Media.SoundPlayerが適しています。
  • 機能性を重視: 複数のフォーマットに対応したり、詳細なオーディオ操作が必要な場合は、NAudioを選ぶと良いでしょう。

System.Media.SoundPlayerを使った再生時間の取得(非推奨)

System.Media.SoundPlayerクラスは、WAVファイルの再生に特化したシンプルなクラスですが、再生時間の取得には直接対応していません。

ここでは、SoundPlayerクラスの基本的な使い方と、再生時間を取得するための工夫、そしてその制限と注意点について説明します。

SoundPlayerクラスの基本的な使い方

SoundPlayerクラスは、WAVファイルを簡単に再生するためのクラスです。

以下に基本的な使い方を示します。

using System;
using System.Media;
class Program
{
    static void Main()
    {
        // WAVファイルのパスを指定
        string filePath = "example.wav";
        
        // SoundPlayerオブジェクトを作成
        SoundPlayer player = new SoundPlayer(filePath);
        
        // WAVファイルを再生
        player.Play();
        
        Console.WriteLine("WAVファイルを再生中...");
    }
}

このコードを実行すると、指定したWAVファイルが再生されます。

SoundPlayerクラスは、Playメソッドを呼び出すだけで簡単に再生を開始できます。

再生時間を取得するための工夫

SoundPlayerクラス自体には再生時間を取得する機能がありませんが、WAVファイルのヘッダー情報を解析することで再生時間を計算することが可能です。

以下にその方法を示します。

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        string wavFilePath = @"sample.wav"; // WAVファイルのパス

        using (FileStream fs = new FileStream(wavFilePath, FileMode.Open, FileAccess.Read))
        {
            BinaryReader reader = new BinaryReader(fs);

            // RIFFヘッダーの確認
            if (new string(reader.ReadChars(4)) != "RIFF")
            {
                throw new Exception("WAVファイルではありません。");
            }

            reader.ReadInt32(); // ファイルサイズ(無視)

            // WAVEフォーマットの確認
            if (new string(reader.ReadChars(4)) != "WAVE")
            {
                throw new Exception("WAVフォーマットではありません。");
            }

            // fmtチャンクの確認
            if (new string(reader.ReadChars(4)) != "fmt ")
            {
                throw new Exception("fmtチャンクが見つかりません。");
            }

            reader.ReadInt32(); // fmtチャンクのサイズ

            short audioFormat = reader.ReadInt16(); // オーディオフォーマット(1: PCM)
            short numChannels = reader.ReadInt16(); // チャンネル数
            int sampleRate = reader.ReadInt32();    // サンプルレート
            reader.ReadInt32(); // バイトレート(無視)
            reader.ReadInt16(); // ブロックアラインメント(無視)
            short bitsPerSample = reader.ReadInt16(); // サンプルあたりのビット数

            // dataチャンクの確認
            while (new string(reader.ReadChars(4)) != "data")
            {
                int chunkSize = reader.ReadInt32(); // 他のチャンクのサイズをスキップ
                reader.BaseStream.Seek(chunkSize, SeekOrigin.Current); // 次のチャンクへ
            }

            int dataSize = reader.ReadInt32(); // データサイズ

            // 再生時間を計算
            double durationInSeconds = (double)dataSize / (sampleRate * numChannels * (bitsPerSample / 8));

            Console.WriteLine($"再生時間: {durationInSeconds}秒");
        }
    }
}

このコードは、WAVファイルのヘッダー情報を解析して再生時間を計算します。

FileStreamを使用してファイルを読み込み、サンプルレートやバイトレートを取得することで、再生時間を求めています。

制限と注意点

SoundPlayerクラスを使用する際の制限と注意点について説明します。

  • 対応フォーマット: SoundPlayerはWAVファイルにのみ対応しており、他のフォーマットには対応していません。
  • 再生時間の取得: クラス自体には再生時間を取得する機能がないため、ヘッダー情報を解析する必要があります。
  • 非同期再生: Playメソッドは非同期で再生を開始するため、再生が終了するまで待機する必要がある場合は、PlaySyncメソッドを使用するか、別途制御を行う必要があります。

これらの制限を理解した上で、SoundPlayerクラスを適切に活用することが重要です。

NAudioライブラリを使った再生時間の取得(推奨)

NAudioライブラリは、C#でオーディオファイルを扱うための強力なツールです。

WAVファイルの再生時間を取得するのも簡単に行えます。

ここでは、NAudioのインストール方法から、AudioFileReaderクラスを使った再生時間の取得方法、そして使用時の注意点について説明します。

NAudioのインストール方法

NAudioはNuGetパッケージとして提供されているため、Visual Studioのパッケージマネージャーを使用して簡単にインストールできます。

  1. NuGetパッケージマネージャーを開く: Visual Studioのメニューから「ツール」→「NuGet パッケージ マネージャー」→「ソリューションの NuGet パッケージの管理」を選択します。
  2. NAudioを検索: 検索ボックスに NAudio と入力し、検索結果からNAudioを選択します。
  3. インストール: プロジェクトを選択し、「インストール」ボタンをクリックします。

これで、NAudioライブラリがプロジェクトに追加され、使用可能になります。

AudioFileReaderクラスの使い方

AudioFileReaderクラスは、オーディオファイルを読み込むためのクラスで、再生時間の取得にも利用できます。

using System;
using NAudio.Wave;
class Program
{
    static void Main()
    {
        // WAVファイルのパスを指定
        string filePath = "example.wav";
        
        // AudioFileReaderオブジェクトを作成
        using (var audioFile = new AudioFileReader(filePath))
        {
            // 再生時間を取得
            TimeSpan duration = audioFile.TotalTime;
            
            Console.WriteLine($"再生時間: {duration.TotalSeconds} 秒");
        }
    }
}

このコードでは、AudioFileReaderを使用してWAVファイルを読み込み、TotalTimeプロパティを利用して再生時間を取得しています。

TotalTimeプロパティの利用

AudioFileReaderクラスTotalTimeプロパティは、オーディオファイルの再生時間をTimeSpanオブジェクトとして返します。

これにより、再生時間を簡単に取得し、表示することができます。

  • 使い方: audioFile.TotalTimeのようにプロパティを呼び出すだけで、再生時間を取得できます。
  • 精度: TotalTimeはファイルのメタデータに基づいて計算されるため、非常に正確です。

NAudioを使う際の注意点

NAudioを使用する際には、以下の点に注意が必要です。

  • 外部依存: NAudioは外部ライブラリであるため、プロジェクトに追加する必要があります。

NuGetを使用して簡単にインストールできますが、プロジェクトの依存関係が増えることを考慮してください。

  • ライセンス: NAudioはオープンソースライブラリであり、ライセンスに従って使用する必要があります。

商用利用の場合は、ライセンス条件を確認してください。

  • パフォーマンス: NAudioは多機能であるため、必要以上に多くの機能を使用するとパフォーマンスに影響を与える可能性があります。

必要な機能だけを使用するように心がけましょう。

これらの注意点を踏まえ、NAudioを活用して効率的にオーディオファイルを操作しましょう。

応用例

NAudioライブラリを使用することで、WAVファイルの再生時間を取得するだけでなく、さまざまな応用が可能です。

ここでは、複数ファイルの再生時間を一括取得する方法や、再生時間に基づくファイルのフィルタリング、再生時間を表示するGUIアプリケーションの作成について説明します。

複数ファイルの再生時間を一括取得する方法

複数のWAVファイルの再生時間を一括で取得するには、ディレクトリ内のファイルをループ処理し、それぞれの再生時間を計算します。

using System;
using System.IO;
using NAudio.Wave;
class Program
{
    static void Main()
    {
        // WAVファイルが格納されているディレクトリのパスを指定
        string directoryPath = "C:\\WavFiles";
        
        // ディレクトリ内のすべてのWAVファイルを取得
        string[] files = Directory.GetFiles(directoryPath, "*.wav");
        
        foreach (string file in files)
        {
            using (var audioFile = new AudioFileReader(file))
            {
                // 再生時間を取得
                TimeSpan duration = audioFile.TotalTime;
                Console.WriteLine($"{Path.GetFileName(file)}: {duration.TotalSeconds} 秒");
            }
        }
    }
}

このコードは、指定したディレクトリ内のすべてのWAVファイルの再生時間を取得し、ファイル名とともに表示します。

再生時間に基づくファイルのフィルタリング

再生時間に基づいてファイルをフィルタリングすることで、特定の条件に合致するファイルのみを処理することができます。

using System;
using System.IO;
using NAudio.Wave;
class Program
{
    static void Main()
    {
        // WAVファイルが格納されているディレクトリのパスを指定
        string directoryPath = "C:\\WavFiles";
        
        // フィルタリングする再生時間の閾値(秒)
        double thresholdSeconds = 60.0;
        
        // ディレクトリ内のすべてのWAVファイルを取得
        string[] files = Directory.GetFiles(directoryPath, "*.wav");
        
        foreach (string file in files)
        {
            using (var audioFile = new AudioFileReader(file))
            {
                // 再生時間を取得
                TimeSpan duration = audioFile.TotalTime;
                
                // 再生時間が閾値を超えるファイルのみを表示
                if (duration.TotalSeconds > thresholdSeconds)
                {
                    Console.WriteLine($"{Path.GetFileName(file)}: {duration.TotalSeconds} 秒");
                }
            }
        }
    }
}

このコードは、再生時間が60秒を超えるWAVファイルのみを表示します。

閾値を変更することで、異なる条件でフィルタリングが可能です。

再生時間を表示するGUIアプリケーションの作成

再生時間を表示するGUIアプリケーションを作成することで、ユーザーに視覚的に情報を提供できます。

ここでは、Windows Formsを使用した簡単な例を示します。

using System;
using System.Windows.Forms;
using NAudio.Wave;
public class MainForm : Form
{
    private Button selectFileButton;
    private Label durationLabel;
    public MainForm()
    {
        selectFileButton = new Button { Text = "ファイルを選択", Dock = DockStyle.Top };
        durationLabel = new Label { Text = "再生時間: ", Dock = DockStyle.Fill, TextAlign = System.Drawing.ContentAlignment.MiddleCenter };
        selectFileButton.Click += SelectFileButton_Click;
        Controls.Add(durationLabel);
        Controls.Add(selectFileButton);
    }
    private void SelectFileButton_Click(object sender, EventArgs e)
    {
        using (OpenFileDialog openFileDialog = new OpenFileDialog())
        {
            openFileDialog.Filter = "WAV files (*.wav)|*.wav";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                using (var audioFile = new AudioFileReader(openFileDialog.FileName))
                {
                    TimeSpan duration = audioFile.TotalTime;
                    durationLabel.Text = $"再生時間: {duration.TotalSeconds} 秒";
                }
            }
        }
    }
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());
    }
}

このコードは、ユーザーがWAVファイルを選択すると、その再生時間を表示する簡単なWindows Formsアプリケーションです。

OpenFileDialogを使用してファイルを選択し、AudioFileReaderで再生時間を取得しています。

これらの応用例を通じて、NAudioライブラリを活用し、さまざまなオーディオファイルの操作を行うことができます。

よくある質問

NAudioとSoundPlayerの違いは何ですか?

NAudioSoundPlayerは、どちらもC#でオーディオファイルを扱うためのツールですが、いくつかの重要な違いがあります。

  • 機能性: NAudioは多機能で、WAVファイルだけでなく、MP3やAACなどのさまざまなオーディオフォーマットを扱うことができます。

一方、SoundPlayerはWAVファイルの再生に特化しており、他のフォーマットには対応していません。

  • 外部依存: NAudioは外部ライブラリであり、NuGetを通じてプロジェクトに追加する必要があります。

SoundPlayerは.NET Frameworkに組み込まれているため、追加のインストールは不要です。

  • 制御の詳細さ: NAudioは再生時間の取得、音量調整、オーディオデータの解析など、詳細な制御が可能です。

SoundPlayerはシンプルな再生機能のみを提供します。

再生時間が正確に取得できない場合の対処法は?

再生時間が正確に取得できない場合、以下の点を確認してください。

  • ファイルの整合性: オーディオファイルが破損している場合、正確な再生時間を取得できないことがあります。

ファイルが正常であるか確認してください。

  • ライブラリのバージョン: 使用しているライブラリのバージョンが古い場合、バグが存在する可能性があります。

最新バージョンにアップデートしてみてください。

  • フォーマットの互換性: 特定のオーディオフォーマットやエンコーディングに対応していない場合があります。

対応フォーマットを確認し、必要に応じて変換を行ってください。

他の音声フォーマットでも同様の方法で再生時間を取得できますか?

NAudioを使用することで、WAV以外の音声フォーマットでも再生時間を取得することが可能です。

AudioFileReaderクラスは、MP3やAACなどの一般的なフォーマットに対応しています。

ただし、すべてのフォーマットに対応しているわけではないため、特定のフォーマットを扱う場合は、対応状況を確認する必要があります。

例:using (var audioFile = new AudioFileReader("example.mp3")) { TimeSpan duration = audioFile.TotalTime; }

このように、AudioFileReaderを使用することで、対応しているフォーマットであれば再生時間を取得できます。

対応していないフォーマットの場合は、別のライブラリを検討するか、フォーマットを変換する必要があります。

まとめ

この記事では、C#でWAVファイルの再生時間を取得する方法について、System.Media.SoundPlayerクラスNAudioライブラリの両方を用いたアプローチを詳しく解説しました。

SoundPlayerのシンプルさとNAudioの多機能性を比較し、それぞれの利点と制限を考慮することで、プロジェクトに最適な方法を選択する手助けとなるでしょう。

これを機に、実際にコードを試しながら、オーディオファイルの操作を行ってみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す