【C#】NAudioで動画の音声のみを再生する方法-ハイレゾ対応可能

  • 2022.03.15
  • C#
【C#】NAudioで動画の音声のみを再生する方法-ハイレゾ対応可能
【C#】NAudioで動画の音声のみを再生する方法-ハイレゾ対応可能

 

 
読了目安:449

Are you want to translate this page to English? Please click this link to translate via ‘©Google Translate'!

ganohr.net favicon

NAudio’(リポジトリ)は、.Netフレームワークで使用可能な、音声・音楽再生用のフレームワークです。

今回はこのNAudioを用いて、動画ファイルから音声のみを再生するコードを解説します。

更新履歴
2020/08/06 ダウンロードマネージャーを変更
2019/07/07 公開
 

NAudioをNuGetで導入する

NuGet’(解説)は、Visual Studio 2012以降標準で搭載されているパッケージマネージャーです。

NAudioを導入する場合、パッケージ名として「naudio」と入力し、『NAudio』とだけになっているパッケージをインストールします。

インストールに成功すれば、「ソリューションエクスプローラー」の「参照ツリー」に、NAudioが追加されます。

 

Visual StudioでNuGetを呼び出すメニューのスクリーンショット画像。
NAudioパッケージをインストールするには、「プロジェクト」→「NuGetパッケージの管理」の準に選択する。
Visual StudioでNuGetを呼び出すメニューのスクリーンショット画像。2/2
「参照」タブで「naudio」と入力して検索し、「NAudio」と完全一致するパッケージをインストールする。インストールに成功すれば、「プロジェクトエクスプローラー」の「参照ツリー」に「NAudio」が追加される。

サンプルコードのダウンロード

ダウンロード

  • ganohrs_naudio_sample.zip
    C#でNAudioを使うサンプルコードです。
    ダウンロード情報 File size: 1 KB Downloads: 93 File type: zip
ダウンロード情報の「Copy:File-Hash」について…

各ファイルの「Copy:File-Hash」にマウスカーソルを重ねると、今からダウンロードするファイルの、 「ファイルが公開された際のハッシュ値」を、SHA256で計算して表示します。

そのままタップしたり、マウスでクリックすると、そのハッシュ値をコピーできます。改ざんされたファイルをダウンロードしていないかチェックしたい場合にご活用下さい。

例えばファイルのダウンロード後に、7-zipなどのツールでダウンロードしたファイルの「CRC-SHA256ハッシュ値を計算し、 コピーした結果と同値であるかチェックする」ことにより、ファイル改ざんの有無を検証できます。このとき、大文字か小文字かの違いは、問題ありません。

なお、「もしもハッシュ値が異なっていた場合、お手数をおかけいたしますが、 作者のTwitter(Ganohr) までご報告ください」ますよう、お願いいたします。

サンプルコード

ソースコードのスクリーンショット画像。
NAudioを用いて動画の音声のみを再生するサンプルコード。

 

using System;
using System.Windows.Forms;
using NAudio.Wave;

namespace NAudioTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) { /* ループでブロッキングするので、予めフォーム描画を強制する */ Show(); Application.DoEvents();
/* 音声プレイヤー、メディアファンデーションリーダーを生成 */ using (var player = new WasapiOut()) using (var reader = new MediaFoundationReader(@"d:\test.mp4")) { /* プレイヤーをリーダーで初期化し再生 */ player.Init(reader); player.Play(); /* フォームを閉じたらプレイヤーを止めるようイベントを定義 */ FormClosed += (cs, ce) => player.Stop(); /* 音声再生位置が最後に到達しておらず、停止されていないならループ */ while (reader.CurrentTime < reader.TotalTime && player.PlaybackState != PlaybackState.Stopped) { /* 100ミリ秒おきにイベントループを処理させる */ System.Threading.Thread.Sleep(100); Application.DoEvents(); } } } } }

サンプルコードの簡単な解説

動画から音声を再生するためには、まず動画ファイルを読み込むためのMediaFoundationReaderをインスタンス化します。

インスタンス化する際に、動画のファイル名をコンストラクタで指定しますが、これは必須になっています。

 

そして、実際に音声を再生するためにWasapiOutのインスタンスのplayer.Init(reader);を用いて読み込んだ音声を指定します。

あとはplayer.Play();で実際に再生が可能です。

とても簡単ですね。

 

今回は手間を掛けずに正しく解放動作をさせるために、whileループを用いて再生状況を監視し、usingステートメントで自動解放させています。

なお、ブロッキングの解消をApplication.DoEvents();で行っています。

また、FormClosedにイベントを定義しており、フォームを閉じたらプレイヤーをplayer.Stop();で停止させています。

この停止処理によりplayer.PlaybackStateで再生状態を取得するとPlaybackState.Stoppedへ変化します。

これにより、whileループの条件が成り立たなくなり、ループが終了します。

 

NAudioのサンプルコードとしては、これぐらいシンプルな構造の方がわかりやすいのではないでしょうか。

NAudioでハイレゾ音源の動画を再生する

WASAPI’(わさぴ、Windows Audio Session API、Wikipedia)とは、Windows Vista以降で使用可能な、比較的新しいオーディオ再生APIです。

WASAPIでオーディオを再生する際に「動作モード」を指定可能です。

動作モードには「共有モード」と「排他モード」があります。

 

この動作モードを「排他モード」にすると、オーディオ出力に他のアプリケーション(OS含む)が介在できなくし、直接的なオーディオ・サンプルの操作を可能にします。

以下のように定義することで、動画をハイレゾ再生できます。

using定義

using NAudio.CoreAudioApi

NAudioでWASAPIを排他モード(ハイレゾ再生可能)にする

using (var player = new WasapiOut(AudioClientShareMode.Exclusive, 100)){~}

 

AudioClientShareMode.Exclusiveで排他モードにし、第二引数で‘レイテンシー’(遅延時間)を100ミリ秒に設定しています。

最後に

今回は動画から単純に音声をNAudioで再生する方法を解説しました。

これだけなら、『DirectShow』や『DirectShow.Net』などを用いればいいでしょう。

ただし、これらのフレームワークには64bitアプリケーションが開発できないという明確な欠点があります。

 

NAudioなら64bitアプリケーションも、32bitアプリケーションも、どちらも開発できます。

そして、様々な音声関連の処理が可能になります。

今後本記事が、C#で凝ったメディアプレイヤーや、動画編集ソフト、音楽編集ソフトを開発しようと思っている方の参考になれば幸いです。

WordPressの不具合対応/カスタマイズ¥15,000~

PC歴25年超、SE歴10年超、WordPress運営歴7年超、WordPressエンジニア歴5年超のスキルとノウハウを提供します

当サイト管理人の「ガノー」(Ganohr)は、日本最大手且つ東証一部上場企業が運営するクラウドソーシングサイト『Lancers』にて、認定ランサーとして活動しています。


※ 認定ランサーとはLancersにより様々な能力 ( 高い仕事遂行率・高い顧客満足度・多くの実績、など ) を評価したプロフェッショナルを認定する制度です。

 

C#カテゴリの最新記事