首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NAudio Wasapi录制和转换

NAudio Wasapi录制和转换
EN

Stack Overflow用户
提问于 2017-08-07 03:13:15
回答 1查看 2K关注 0票数 2

我正在使用NAudio,并尝试用WasapiLoopbackCapture录制我的pc上正在播放的内容。我的问题是,我需要记录的数据作为PCM16位44100 The单声道。为此,我构造了以下内容:

代码语言:javascript
复制
using System;
using System.Diagnostics;

using NAudio.Wave;
using NAudio.CoreAudioApi;

namespace soundtest
{
    class Program {

        static void Main(string[] args) {
            try {
                var deviceToRecord = (new MMDeviceEnumerator().EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active))[0];

                var recorder = new CustomWasapiLoopbackCapture(deviceToRecord, false, 1000 / 5);
                recorder.ShareMode = AudioClientShareMode.Shared;
                recorder.DataAvailable += recorderDataAvailable;

                var inprov = new WaveInProvider(recorder);
                var fto16prov = new WaveFloatTo16Provider(inprov);
                var stomprov = new StereoToMonoProvider16(fto16prov);

                Console.WriteLine("Press something to stop recording.");
                recorder.StartRecording();
                Console.ReadKey();
                recorder.StopRecording();

            } catch (Exception e) {
                Console.WriteLine("!!! EXCEPTION !!!" + 
                    "\nMessage:\n   " + e.Message + 
                    "\nSource:\n   " + e.Source + 
                    "\nStack:\n" + e.StackTrace);
            }

            Console.WriteLine("Press something to close.");
            Console.ReadKey();
        }

        static void recorderDataAvailable(object sender, WaveInEventArgs args) {
            // how do I access PCM 16bit here?
            // It's not args.Buffer, or am I wrong?
            // additional calculation is done here with the PCM data
        }
    }


    class CustomWasapiLoopbackCapture : WasapiCapture
    {
        public CustomWasapiLoopbackCapture() 
            : this(GetDefaultLoopbackCaptureDevice()){ }
        public CustomWasapiLoopbackCapture(MMDevice captureDevice)
            : this(captureDevice, false){ }
        public CustomWasapiLoopbackCapture(MMDevice captureDevice, bool useEventSync)
            : this(captureDevice, useEventSync, 100){ }
        public CustomWasapiLoopbackCapture(MMDevice captureDevice, bool useEventSync, int audioBufferMillisecondsLength)
            : base(captureDevice, useEventSync, audioBufferMillisecondsLength){ }

        public static MMDevice GetDefaultLoopbackCaptureDevice() {
            MMDeviceEnumerator devices = new MMDeviceEnumerator();
            return devices.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
        }

        public override WaveFormat WaveFormat
        {
            get { return base.WaveFormat; }
            set { throw new InvalidOperationException("WaveFormat cannot be set for WASAPI Loopback Capture"); }
        }

        protected override AudioClientStreamFlags GetAudioClientStreamFlags() {
            return AudioClientStreamFlags.Loopback;
        }
    }
}

如何访问转换后的录音?我认为,通过添加这些提供程序,我可以获得进一步计算的数据。我认为args.Buffer不能提供预期的PCM16位44100 kHz单声道数据的假设来自于我在recorderDataAvailable方法中进行的额外处理的不切实际的结果。我在我的混音板的另一个输入上用一个简单的WaveInEvent测试了这一点,我用它循环播放声音。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-08 03:22:43

WASAPI始终将音频录制为IEEE浮点采样。因此,在回调中获得的录制缓冲区中,每4个字节就是一个float。访问单个样本的一种简单方法是使用BitConverter.ToSingle。这将为您提供一个在+/- 1.0范围内的值。因此乘以32767,然后转换为Int16,以将其转换为16位采样值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45535659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档