본문 바로가기
개발언어/C#

C#을 사용한 마이크 오디오 액세스

by 창용이랑 2023. 2. 21.
728x90
C# 어플리케이션에서 NAudio를 사용하여 마이크 오디오를 샘플화하는 방법

오디오 분석 및 시각화 | 2022년 5월 7일 | 퍼머링크 | 뷰 소스

이 페이지에서는 NAudio를 사용하여 C# 어플리케이션의 마이크오디오에 액세스하는 방법에 대해 설명합니다. 외의 코드 예에 대해서는, 「Audio Analysis and Visualization Page 」를 참조해 주세요.

프로젝트 셋업

  • NAudio 패키지를 추가합니다. dotnet add package naudio
  • 대상 Windows: NAudio는 Windows만 지원하므로 추가할 프로젝트 파일을 편집하십시오.-windows목표 프레임워크에 맞게
<TargetFramework>net6.0-windows</TargetFramework>

오디오 녹음

이것은 의 완전한 소스 코드입니다.콘솔에 마이크레벨을 표시하는 NET 6 콘솔어플리케이션

var waveIn = new NAudio.Wave.WaveInEvent
{
    DeviceNumber = 0, // indicates which microphone to use
    WaveFormat = new NAudio.Wave.WaveFormat(rate: 44100, bits: 16, channels: 1),
    BufferMilliseconds = 20
};
waveIn.DataAvailable += WaveIn_DataAvailable;
waveIn.StartRecording();

Console.WriteLine("C# Audio Level Meter");
Console.WriteLine("(press any key to exit)");
Console.ReadKey();

static void WaveIn_DataAvailable(object? sender, NAudio.Wave.WaveInEventArgs e)
{
    // copy buffer into an array of integers
    Int16[] values = new Int16[e.Buffer.Length / 2];
    Buffer.BlockCopy(e.Buffer, 0, values, 0, e.Buffer.Length);

    // determine the highest value as a fraction of the maximum possible value
    float fraction = (float)values.Max() / 32768;

    // print a level meter using the console
    string bar = new('#', (int)(fraction * 70));
    string meter = "[" + bar.PadRight(60, '-') + "]";
    Console.CursorLeft = 0;
    Console.CursorVisible = false;
    Console.Write($"{meter} {fraction * 100:00.0}%");
}

추가 설정

샘플 레이트

위의 코드에서 샘플링 속도는 다음과 같습니다.44100샘플/초(44.1kHz)입니다.이것은, CD음질의 오디오의 일반적인 샘플 레이트입니다.그러나 응용 프로그램에서 이렇게 높은 샘플링 속도를 요구하지 않는 경우 이 값을 줄이는 것이 좋습니다.전화기의 음질이 거의 없습니다.8000Hz.

비트 깊이

위의 코드에서는16-bitdepth가 사용됩니다.이것은 일반적인 오디오 기기의 가장 일반적인 비트 깊이입니다.16비트 오디오는 각 샘플의 레벨이 0 ~2-116(65,535)의 값으로 표시되는 것을 의미합니다.오디오 레벨은 중간 부근에 머무르며 양의 데이터와 음의 데이터를 확장하므로 부호 있는 16비트 정수로 간주하는 것이 가장 좋습니다.Int16(±32,768까지 확장 가능).

좌우 채널

위의 코드에서는 왼쪽 채널의 오디오만 분석됩니다.단일 채널을 캡처하면 단순한 버퍼가 생성됩니다.이 버퍼는 바이트 배열로Int16[]연속 파형의 경우.2개의 채널을 사용하는 경우Int16[]에는 인터리브 데이터가 포함되어 있습니다.즉, 각 채널의 데이터는 다른 모든 데이터 포인트로 표시됩니다.버퍼 어레이를 분리하다Int16[]좌우 채널의 어레이는 다음과 같이 실현할 수 있습니다.

static void WaveIn_DataAvailable(object? sender, NAudio.Wave.WaveInEventArgs e)
{
    int bytesPerSample = 2;
    int channelCount = 2;
    int sampleCount = e.Buffer.Length / bytesPerSample / channelCount;

    Int16[] valuesL = new Int16[sampleCount];
    Int16[] valuesR = new Int16[sampleCount];

    for (int i = 0; i < sampleCount; i++)
    {
        int position = i * bytesPerSample * channelCount;
        valuesL[i] = BitConverter.ToInt16(e.Buffer, position);
        valuesR[i] = BitConverter.ToInt16(e.Buffer, position + 2);
    }

    float maxPercentL = (float)valuesL.Max() / 32768 * 100;
    float maxPercentR = (float)valuesL.Max() / 32768 * 100;
    Console.WriteLine($"L: {maxPercentL}% R:{maxPercentR}%");
}

오디오 입력 디바이스 검색

의 설정DeviceNumber고객님의WaveInEvent샘플링되는 오디오 입력 디바이스를 결정합니다.사용하다NAudio.Wave.WaveIn.GetCapabilities()모든 오디오 디바이스에 대한 정보를 가져옵니다.

for (int i = -1; i < NAudio.Wave.WaveIn.DeviceCount; i++)
{
    var caps = NAudio.Wave.WaveIn.GetCapabilities(i);
    Console.WriteLine($"{i}: {caps.ProductName}");
}

출력:

-1: Microsoft Sound Mapper
0: Microphone (High Definition Aud
1: Wave Link MicrophoneFX (Elgato
2: Wave Link Stream (Elgato Wave:X
3: Microphone (HD Webcam C270)
4: Wave Link Monitor (Elgato Wave:
5: Mic In (Elgato Wave:XLR)

NAudio 개발자(#379, #612)에 따르면 오디오 디바이스 설명은 Windows API의 제한으로 인해 32자로 잘립니다.

자원.

 

 

소스 : https://github.com/swharden/Csharp-Data-Visualization/blob/main/website/content/audio/naudio/index.md

 

GitHub - swharden/Csharp-Data-Visualization: Resources for visualizing data using C# and the .NET platform

Resources for visualizing data using C# and the .NET platform - GitHub - swharden/Csharp-Data-Visualization: Resources for visualizing data using C# and the .NET platform

github.com

 

출처 : https://swharden.com/csdv/audio/naudio/