본문 바로가기
C#/NAudio

WasapiLoopbackCapture와 Silence

by Falto 2023. 3. 23.

WasapiLoopbackCapture는 시스템 사운드를 녹음할 때 쓰는 클래스다.

근데 아무 소리도 안 나면 녹음을 안 한다. 즉 소리에 공백이 생기는 걸 허용하지 않는다.

1초 동안 소리 내고 10초 쉰 다음 1초 동안 소리 내면 파일에는 2초 길이의 소리만 저장된다는 소리다.

특수한 경우가 아닌 이상 이런 결과물을 원하는 프로그래머는 없을 것이다.

그에 대한 가장 간단한 해결 방안은 Silence를 play시켜서 소리의 공백에도 계속 파일에 소리가 기록되게끔 하는 장치를 만드는 거다.

// 예시
            waveIn = new WasapiLoopbackCapture(recordingDevice);
            waveIn.DataAvailable += OnDataAvailable;
            waveIn.RecordingStopped += OnRecordingStopped;
            waveIn.StartRecording();
            string id = recordingDevice.ID;
            
            new Thread(() =>
            {
                // An MMDevice can only be used on the Thread that it was instantiated on,
                // using it outside that thread will cause a COM exception.
                // https://stackoverflow.com/questions/52345617
                MMDevice device;
                using (var mmde = new MMDeviceEnumerator())
                {
                    device = mmde.GetDevice(id);
                }

                var silence = new SilenceProvider(waveIn.WaveFormat);
                using (var wasapiOut = new WasapiOut(device, AudioClientShareMode.Shared, false, 250))
                {
                    wasapiOut.Init(silence);
                    while (!exit)
                    {
                        wasapiOut.Play();
                        Thread.Sleep(250);
                    }
                }
            }).Start();

ref: https://stackoverflow.com/questions/52345617

댓글