(相談内容変更)デスクトップ音声取得後の処理について

実現したいこと

C#初心者です。デスクトップ音声データを取得してグラフィックイコライザ表示したいと考えています。

発生している問題・分からないこと

NAudioでWASAPIでデスクトップ音声の取得を試みていますが、データが正しく取れていないことが原因でエラーになります。(VisualStudio上でデバッグ時にエラーが出る)。どうしたら良いのか分からずご質問します。

エラーメッセージ

error

1System.IndexOutOfRangeException: 'インデックスが配列の境界外です。'

該当のソースコード

C#

1using System;2using System.Collections.Generic;3using System.ComponentModel;4using System.Data;5using System.Drawing;6using System.Linq;7using System.Numerics;8using System.Text;9using System.Threading.Tasks;10using NAudio.CoreAudioApi;11using NAudio.Wave;12using System.Windows.Forms.DataVisualization.Charting;13using System.Windows.Forms;14 15namespace N_STAGE_Visualizer 16{17 public partial class Form1 : Form 18 {19 private WasapiCapture capture;20 private readonly int fftLength = 1024; // FFTのサンプル数21 private readonly Complex[] fftBuffer;22 private readonly double[] fftValues;23 private Chart chart;24 25 public Form1()26 {27 InitializeComponent();28 29 // チャートの初期化30 chart = new Chart();31 chart.Series.Clear();32 chart.Series.Add("Spectrum");33 chart.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column; // 棒グラフに変更34 chart.Series[0].Color = System.Drawing.Color.Blue;35 chart.Series[0]["PointWidth"] = "1"; // バーの幅を調整36 this.Controls.Add(chart);37 38 // FFT用のバッファと値の初期化39 fftBuffer = new Complex[fftLength];40 fftValues = new double[fftLength];41 42 // WASAPIキャプチャの初期化43 capture = new WasapiLoopbackCapture();44 capture.DataAvailable += Capture_DataAvailable;45 capture.StartRecording();46 }47 48 private void Capture_DataAvailable(object sender, WaveInEventArgs e)49 {50 // オーディオデータをバッファにコピー51 for (int i = 0; i < e.BytesRecorded / 2; i++)52 {53 short sample = BitConverter.ToInt16(e.Buffer, i * 2);54 55 // 追加のデバッグ情報56 Console.WriteLine($"Index: {i}, Sample: {sample}, BytesRecorded: {e.BytesRecorded}, Buffer Length: {e.Buffer.Length}");57 58 fftBuffer[i] = new Complex(sample, 0);59 }60 61 // FFTを実行62 MathNet.Numerics.IntegralTransforms.Fourier.Forward(fftBuffer);63 64 // マグニチュードを計算65 for (int i = 0; i < fftLength; i++)66 {67 fftValues[i] = fftBuffer[i].Magnitude;68 }69 70 // グラフに表示71 BeginInvoke(new Action(() =>72 {73 chart.Series[0].Points.Clear();74 for (int i = 0; i < fftLength / 2; i++)75 {76 chart.Series[0].Points.AddY(fftValues[i]);77 }78 }));79 }80 81// 後略

試したこと・調べたこと

上記の詳細・結果

ChatGPT先生に相談しつつ書いています。この質問を投稿した後、処理をNAUDIOではなくWASAPI経由での取得に変更したところ、音声は正しく取得されデータが入るようになりました。なので、問題としては音声取得そのものではなく、受け取った後の処理に話が変わったと思っています。

補足

実際に取得しているログは下記のような感じです。

log.txt

1<投稿時> 2Index: 943, Sample: 0, BytesRecorded: 17640, Buffer Length: 17640 3Index: 944, Sample: 0, BytesRecorded: 17640, Buffer Length: 17640 4Index: 945, Sample: 0, BytesRecorded: 17640, Buffer Length: 17640 5 6<投稿後、WASAPI経由に変更、モノラルからステレオに変更> 7Index: 1017, Sample: -17483, BytesRecorded: 23040, Buffer Length: 38400 8Index: 1018, Sample: -2689, BytesRecorded: 23040, Buffer Length: 38400 9Index: 1019, Sample: -17540, BytesRecorded: 23040, Buffer Length: 38400 10Index: 1020, Sample: -22025, BytesRecorded: 23040, Buffer Length: 38400 11Index: 1021, Sample: -17468, BytesRecorded: 23040, Buffer Length: 38400 12Index: 1022, Sample: 19203, BytesRecorded: 23040, Buffer Length: 38400 13Index: 1023, Sample: -17435, BytesRecorded: 23040, Buffer Length: 38400 14Index: 1024, Sample: 14222, BytesRecorded: 23040, Buffer Length: 38400

変更後、Sampleに正しくデータが乗るようになりました。ので、問題のポイントは取得そのものではなく、取得後の処理の話になりました。

コメントを投稿

0 コメント