녹음 어플리케이션 만들기 - slog(완료)

녹음은 ASIO를 사용하려 합니다.

NAudio에서 지원하고 있으며, ASIO를 지원하는 사운드 드라이버가 필요합니다. (대부분 되는 것으로 알고 있습니다.) 낮은 레이턴시와 높은 해상도를 지원하는 장점이 있는데, 사실 녹음기 만드는데 큰 이점은 없어 보입니다. 경험이 없어 사용해 보는 것입니다.

NAudio에서 ASIO를 사용하는 방법은 너무나 간단합니다.

먼저 AsioOut.GetDriverNames()를 통해 ASIO 목록을 받습니다. 이 목록에 선택해서, AsioOut 개체를 생성합니다.

ar drivers = AsioOut.GetDriverNames();

foreach (var driver in drivers)
{
    Console.WriteLine(driver);
}

var driverName = "Focusrite USB ASIO";
var sampleRate = 96000;

using var asioOut = new AsioOut(driverName);
asioOut.InputChannelOffset = 0;
asioOut.InitRecordAndPlayback(null, 1, sampleRate);

여러 채널을 지원하는 장비를 위해 InputChannelOffsetInitRecordAndPlayback()함수를 통해 총 채널 중 몇번째 부터 몇개의 채널로 녹음할지를 결정합니다. 저는 단일 채널의 마이크이므로 InputChannelOffset0으로, 그리고 InitRecordAndPlayback(null, 1, sampleRate)로 해서 하나의 채널로 설정 합니다.

그 다음 마이크로 입력된 정보를 처리하기 위해 AudioAvalidable에 이벤트를 걸어 줍니다.

asioOut.AudioAvailable += (s, e) =>
{
    var count = e.GetAsInterleavedSamples(buffer);

    writer.WriteSamples(buffer, 0, count);
};

여기서 writer는 비압축 WAV Writer로,

var buffer = new float[512];
using var writer = new WaveFileWriter(@"W:\output.wav", new WaveFormat(sampleRate, 1));

다음처럼 생성 후 사용할 수 있습니다.

그런 후, asioOut.Player()를 하면 콘솔에서 해당 장치로 녹음을 할 수 있습니다.

using NAudio.Wave;

Thread.CurrentThread.SetApartmentState(ApartmentState.Unknown);
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);

var drivers = AsioOut.GetDriverNames();

foreach (var driver in drivers)
{
    Console.WriteLine(driver);
}

var driverName = "Focusrite USB ASIO";
var sampleRate = 96000;

using var asioOut = new AsioOut(driverName);
asioOut.InputChannelOffset = 0;
asioOut.InitRecordAndPlayback(null, 1, sampleRate);

var buffer = new float[512];
using var writer = new WaveFileWriter(@"W:\output.wav", new WaveFormat(sampleRate, 1));
asioOut.AudioAvailable += (s, e) =>
{
    var count = e.GetAsInterleavedSamples(buffer);

    writer.WriteSamples(buffer, 0, count);
};

asioOut.Play();

Console.ReadLine();

그런데 NAudio는 결국엔 윈도우에서 제공하는 ASIO 관련 COM 개체를 사용하는 것인데, 최상위문에서는 [STAThread] 속성을 사용할 수가 없으므로

다음 처럼,

Thread.CurrentThread.SetApartmentState(ApartmentState.Unknown);
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);

설정 후 사용할 수 있게 됩니다.

NAudio는 다양한 사운드 확장자(wav, mp4, wma, mp3, flac, m4a)를 지원합니다.

4개의 좋아요