C#で音声ファイルを扱うライブラリにNAudioがあります。今回はWinFomsで音声ファイルを再生するシンプルなアプリを作成しました。
コマンドライン引数で再生するオーディオファイルのパスを受け取り、再生し再生が終了したらアプリケーションを終了する仕様となっています。
フォームにはコントロールを配置していないので何も表示されないフォームになっています。
プロジェクトの作成
dotnet new winforms -n SimpleAudioPlayer01
cd SimpleAudioPlayer01
dotnet add package NAudio
ソースコード
using System;
using System.IO;
using System.Windows.Forms;
using NAudio.Wave;
using NAudio.Wave.SampleProviders;
namespace SimpleAudioPlayer01;
public partial class Form1 : Form
{
private WaveOutEvent? waveOut;
private AudioFileReader? audioFile;
// コンストラクタ
public Form1()
{
InitializeComponent();
this.Load += Form1_Load; // ロードイベント登録
}
private void Form1_Load(object? sender, EventArgs e)
{
// コマンドライン引数のパスが存在するファイルの場合、再生処理を試みる。
string[] args = Environment.GetCommandLineArgs();
if (args.Length > 1)
{
string filePath = args[1];
if (File.Exists(filePath))
{
PlayAudio(filePath);
}
}
}
// 再生
private void PlayAudio(string filePath)
{
try
{
waveOut = new WaveOutEvent(); // WaveOutの生成
audioFile = new AudioFileReader(filePath); // 再生ファイルオブジェクトの生成
waveOut.Init(audioFile); // 再生ファイルオブジェクトの初期化
waveOut.PlaybackStopped += WaveOut_PlaybackStopped; // 再生終了イベント登録
waveOut.Play(); // 再生
}
catch (Exception ex)
{
MessageBox.Show($"再生中にエラーが発生しました: {ex.Message}", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
// アプリケーション終了
Application.Exit();
}
}
// 再生終了イベント
private void WaveOut_PlaybackStopped(object? sender, StoppedEventArgs e)
{
if (waveOut != null)
{
waveOut.Dispose(); // waveOut解放
waveOut = null;
}
if (audioFile != null)
{
audioFile.Dispose(); // 再生ファイルオブジェクト解放
audioFile = null;
}
// アプリケーションの終了
Application.Exit();
}
}
実行
dotnet run "再生するオーディオファイルのパス"
ビルド
# 出力先のフォルダはフルパスで記述
dotnet build -c Release -o "出力先のフォルダ"
出力先のフォルダに~を含めたところ展開されませんでした。.は大丈夫だと思いますが念のためフルパスをしていた方がよさそうです。
感想
エクスプローラーでオーディオファイルと関連付けしてダブルクリックで再生するようにしてみたところ、起動が速いので意外と使える感じがします。
そうなると、UIは何もないので、再生と停止機能とボリューム機能、再生のファイル名ぐらいは表示するか、それともこのままにするかはオイオイ検討します。
あとオーディオファイルと関連付けするとエクスプローラーでファイルのアイコンが変更されるのでアプリケーションアイコンは欲しいです。Google Iconsで良さそうなアイコンを探してみます。
コメント