[C#] WAVファイルの再生時間を取得する方法
C#でWAVファイルの再生時間を取得するには、System.Media.SoundPlayerクラス
やNAudio
ライブラリを使用する方法があります。
SoundPlayerクラス
は簡単ですが、再生時間を直接取得する機能はありません。
一方、NAudio
ライブラリを使用すると、AudioFileReaderクラス
を利用してWAVファイルの詳細情報を取得できます。
具体的には、AudioFileReader
のTotalTime
プロパティを使用することで、再生時間をTimeSpan
オブジェクトとして取得できます。
NAudio
はNuGetからインストール可能で、音声ファイルの操作に便利です。
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.SoundPlayer
とNAudio
のどちらを選ぶかは、プロジェクトの要件によります。
以下に選択のポイントを示します。
特徴 | System.Media.SoundPlayer | NAudio |
---|---|---|
簡単さ | 高い | 中程度 |
機能性 | 低い | 高い |
対応フォーマット | 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のパッケージマネージャーを使用して簡単にインストールできます。
- NuGetパッケージマネージャーを開く: Visual Studioのメニューから「ツール」→「NuGet パッケージ マネージャー」→「ソリューションの NuGet パッケージの管理」を選択します。
- NAudioを検索: 検索ボックスに
NAudio
と入力し、検索結果からNAudio
を選択します。 - インストール: プロジェクトを選択し、「インストール」ボタンをクリックします。
これで、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
ライブラリを活用し、さまざまなオーディオファイルの操作を行うことができます。
まとめ
この記事では、C#でWAVファイルの再生時間を取得する方法について、System.Media.SoundPlayerクラス
とNAudio
ライブラリの両方を用いたアプローチを詳しく解説しました。
SoundPlayer
のシンプルさとNAudio
の多機能性を比較し、それぞれの利点と制限を考慮することで、プロジェクトに最適な方法を選択する手助けとなるでしょう。
これを機に、実際にコードを試しながら、オーディオファイルの操作を行ってみてください。