ロゴ メインコンテンツへ
RSSフィード
「ソフトウェア開発」に関連する記事一覧

C# NAudioでフェードアウトさせる

2021/08/02
(この記事の文字数: 348)

C#でNAudioを使って .wav ファイルを再生した後、フェードアウトでBGMを終了したくなりました。実現方法をメモしておきます。

ネットで調べると、ISampleProvider を継承したクラスを実装して、予め指定した特定時間からフェードアウトするようにするサンプルが見つかりました。

https://gist.github.com/markheath/8fb396a5fe4bf117f361

しかし、これは私のやりたい事ではありません。再生中の任意のタイミングでフェードアウトを実行する、というのが私のやりたい事です。

結論としては、WaveOutEvent に Volume プロパティがあったので、そのプロパティの値を徐々に下げていくだけの簡単な実装で実現できました。

サンプルコードを貼っておきます。

var reader = new AudioFileReader("./test.wav");
WaveOutEvent output = new WaveOutEvent();
reader.Volume = 1.0f;
output.Init(reader);

// 再生開始
output.Play();

// 1秒再生
Thread.Sleep(1000);

// 3秒かけてフェードアウト
int fadeOutMilliseconds = 3000;
int fadeOutSamples = 10;
int sleepMilliseconds = fadeOutMilliseconds / fadeOutSamples;
float volumeDecrement = output.Volume / fadeOutSamples;
for (int i = 0; i < fadeOutSamples; ++i)
{
    Thread.Sleep(sleepMilliseconds);

    float nextVolume = output.Volume - volumeDecrement;
    output.Volume = nextVolume < 0.0f ? 0.0f : nextVolume;
}

output.Stop();


  このエントリーをはてなブックマークに追加  

<<「ソフトウェア開発」の記事一覧に戻る

<<「ソフトウェア開発」の次の記事
「ソフトウェア開発」の前の記事 >>

コメント(5 件)


5(ID: 2345050674)
2023-12-01 16:35

別クラスでという意味でしょうか?
勉強不足ですいません。

4(管理人)
2023-11-29 08:12

あぁ、なるほど。すみません、書いてなかったんですが、私の手元では、この処理を Task.Run() で独立した別スレッドで非同期実行していました。
詳しくは調べてませんが、もしかしたら、メインスレッドで実行すると、Thread.Sleep() によって音を再生するために必要な処理がブロックされて音が鳴らないのかもしれません。

3(ID: 612059286)
2023-11-28 20:02

ご返信ありがとうございます!
また、わざわざ記事の掲載ありがとうございます!
返信がこんなに早いとは思わず、こちらの返信が遅れてすいません。

こちら試してみましたが、なぜかこちらの環境ではうまくいきませんでした。
(デバックモードで数値等を見る限りはうまくいっているはずなのですが、音声自体はなぜか止まっている状態)

なので、動きとしては完璧なので、仕組みを理解し「Thread.Sleep」を「Timer_tick」に置き換えて、タイマーのインターバルを「sleepMilliseconds」と同じ数値にして似たようなことをやってみたところ、何とかうまくいったので、かなり力技になりますがそちらで実装しました。
減衰していく処理等はまんまコピーさせていただきました。本当にありがとうございます!

2(管理人)
2023-11-26 23:28

参考になるかはわかりませんが、以下の記事にループ再生するwavをフェードイン、フェードアウトさせる簡易サンプルを掲載しておきました。
https://puarts.com/?pid=1862

私の手元ではこちらのサンプルでフェードイン、フェードアウトできました。
やってることはこの記事と同じですが、サンプル数を10から100に増やしています。サンプル数が少ないと、フェードせずに終了したように聞こえる場合があるので、それが原因かもしれません。

1(ID: 612059286)
2023-11-26 19:10

始めまして。とても参考になる記事ありがとうございます。
現在趣味で作成しているWindowsフォームの音楽再生アプリで音声切り替え時にフェードアウト機能を付けたいと思い、こちらの記事を拝見しましたが
Loop再生時に上記コードを利用しても、フェードアウトされずに再生がストップしてしまいます。

※Loop再生はこちらの記事を参照しました。こちらもありがとうございます。
https://puarts.com/?pid=1689

Loop再生時も音源の終了時にフェードアウトさせる方法をお手すきの際にご教授いただけると幸いです。


コンテンツロード: 0.0083 sec
Copyright(C)2006-2024 puarts All Rights Reserved