我想录制声卡(输出)中的音频.我在codeplex上找到了CSCore,但我找不到任何例子.有谁知道如何使用库来录制声卡中的音频并将记录数据写入硬盘?或者有人知道该库的一些教程吗?
首先,为了阐明我的目标:我使用CSCore库并使用WasapiLoopbackCapture该类捕获背景音频,我打算将其用作System.Speech.Recognition识别引擎的实时输入.该类将数据输出到.WAV文件或Stream.然后我尝试这样做:
private void startButton_Click(object sender, EventArgs e)
{
_recognitionEngine.UnloadAllGrammars();
_recognitionEngine.LoadGrammar(new DictationGrammar());
LoadTargetDevice();
StartStreamCapture(); // Here I am starting the capture to _stream (MemoryStream type)
_stream.Position = 0; // Without setting this, I get a stream format exception.
_recognitionEngine.SetInputToWaveStream(_stream);
_recognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
}
Run Code Online (Sandbox Code Playgroud)
结果是我没有得到异常,但我也没有得到SpeechRecognized或SpeechDetected事件被触发.我怀疑这是因为System.Speech.Recognition程序集不支持实时流.我在网上搜索,有人报告实施自定义Stream类型作为解决方法,但我无法按照帖子上的说明进行操作,这些说明不明确(请参阅Dexter Morgan的回复).
我知道这个问题最好通过使用不同的库或替代方法来解决,但我想知道如何专门做这个临时实现,主要是出于知识目的.
谢谢!
CSCore(https://github.com/filoe/cscore)似乎是一个非常好的C#音频库,但它缺乏文档和很好的例子.
我一直在玩Bass.Net很长一段时间,CSCore的架构不像Bass库,所以很难找到正确的方法来完成一些常见的任务.
我正在尝试从WasapiCapture设备捕获麦克风输入并将记录的数据输出到WasapiOut设备,但我无法成功.
以下是我在谷歌搜索后可以找到的代码,但它不起作用.
MMDeviceEnumerator deviceEnum = new MMDeviceEnumerator();
MMDeviceCollection devices = deviceEnum.EnumAudioEndpoints(DataFlow.Capture, DeviceState.Active);
using (var capture = new WasapiCapture())
{
capture.Device = deviceEnum.GetDefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia);
capture.Initialize();
using (var source = new SoundInSource(capture))
{
using (var soundOut = new WasapiOut())
{
capture.Start();
soundOut.Device = deviceEnum.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
soundOut.Initialize(source);
soundOut.Play();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我要做的是写一个像这样的应用程序:http: //www.pitchtech.ch/PitchBox/
我有自己的DSP功能,我想将其应用于记录数据.
有没有人有将WasapiCapture指向WasapiOut并编写自定义DSP的例子?
编辑:
我在CSCore库创建者Florian Rosmann(filoe)的帮助下找到了解决方案.
这是一个DSP类,它放大了提供的音频数据.
class DSPGain: ISampleSource
{
ISampleSource _source;
public DSPGain(ISampleSource source)
{
if (source == null)
throw new ArgumentNullException("source");
_source …Run Code Online (Sandbox Code Playgroud) 我有一些简单的代码使用TTS生成一个wave文件,然后播放它:
public void TestSpeech()
{
SpeechSynthesizer synth = new SpeechSynthesizer();
using (MemoryStream stream = new MemoryStream())
{
synth.SetOutputToWaveStream(stream);
synth.Speak("Hello world");
stream.Seek(0, SeekOrigin.Begin);
IWaveSource source = new WaveFileReader(stream);
EventWaitHandle waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset);
var soundOut = new WasapiOut();
soundOut.Initialize(source);
soundOut.Stopped += (s, e) => waitHandle.Set();
soundOut.Play();
waitHandle.WaitOne();
soundOut.Dispose();
source.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
一切都工作正常,但我想知道在我开始播放wave文件之前会持续多长时间.有没有计算这个的方法,或者它可以在某个地方使用?
如果它在某处可用,它是如何计算的?我假设它与流中的数据量有关,但是如何?
几天后,我试图用C#创建一个均衡器.看过NAudio很多时间,但我找不到任何适用于naudio的均衡器.现在几天之后,我终于在@stackoverflow,希望你知道一种使用c#创建均衡器的方法.
PS:我也尝试过System.Media.SoundPlayer.但SoundPlayer甚至不支持任何与dsp有关的东西.那么还有另一个音频库可以在外面使用"纯"音频吗?
我正在尝试连接用于远程呼叫的USB设备,它具有用于麦克风和扬声器的pnp声音控制器.现在我有两个扬声器和两个麦克风用于输入输出,如下图所示.
.现在我的动机是将音频流从系统麦克风传输到USB麦克风,从USB扬声器传输到系统扬声器.
我试图用虚拟有线电视软件来解决这个问题但是我需要依赖第三方.使用c#可以获得什么样的解决方案.
我对此并不了解,所以不知道如何开始.谷歌搜索后我找到了
可以帮助我,我不知道如何.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
List<NAudio.Wave.WaveInCapabilities> sources = new List<NAudio.Wave.WaveInCapabilities>();
for (int i = 0; i < NAudio.Wave.WaveIn.DeviceCount; i++)
{
sources.Add(NAudio.Wave.WaveIn.GetCapabilities(i));
}
sourceList.Items.Clear();
foreach (var source in sources)
{
ListViewItem item = new ListViewItem(source.ProductName);
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, source.Channels.ToString()));
sourceList.Items.Add(item);
}
}
NAudio.Wave.WaveIn sourceStream,sourceStream1 = null;
NAudio.Wave.DirectSoundOut waveOut = null;
private void button2_Click(object sender, EventArgs e)
{
if (sourceList.SelectedItems.Count …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个C#代码,用于从访问声音输出的每个窗口应用程序输出当前音频输出级别(如Volume混音器中不断变化的绿色条所示).
该程序将每10毫秒检查一次,并输出如下:Windows Media Player:30,Mozilla Firefox:0,Adobe Flash Player:35(根据图)
我正在使用Windows 7,并在C#中尝试它(因为Java无法实现这一点).
我已经找到了为正在运行的应用程序获取和设置主音量(对于Windows Media Player显示65%的句柄栏)的方法,有没有办法获得绿色波动的水平数据?
谢谢!

如何实时流式传输CSCore捕获的声卡输出音频?是否可以使用 FFMpeg 等库将其编码为 MPEG 音频流,然后使用 WebSocket 进行流式传输?
使用 CSCore,如何从FileStreamor播放 WMA 或 MP3 MemoryStream(与使用string文件路径或 url的方法不同)。
我正在尝试通过 tcp 套接字连接将音频从一台计算机单向流式传输到另一台计算机。
计算机 1 ---> 交换机 ---> 计算机 2
计算机 1 是发送方/客户端,计算机 2 是播放音频的接收方/服务器。
我设法让它发挥作用,但收到了很多噪音。
CS核心:
这是我目前用来发送数据的代码:
CaptureInstance = new WasapiLoopbackCapture();
CaptureInstance.Initialize();
CaptureInstance.DataAvailable += (s, a) => onStart(s, a);
CaptureInstance.Start();
Run Code Online (Sandbox Code Playgroud)
其中 onStart 只是使用 BinaryWriter 将字节写入套接字的流:
writer.Write(a.Data, a.Offset, a.ByteCount);
Run Code Online (Sandbox Code Playgroud)
这是我目前在接收计算机上用于播放音频的代码:
int size = 3840;
WriteableBufferingSource src = new WriteableBufferingSource(new CSCore.WaveFormat(48000, 32, 2)) { FillWithZeros = true };
WasapiOut soundOut = new WasapiOut();
soundOut.Initialize(src);
soundOut.Play();
while (true)
{
byte[] bytes = reader.ReadBytes(size); // BinaryReader
src.Write(bytes, 0, size);
}
Run Code Online (Sandbox Code Playgroud)
NA音频:
经过进一步的搜索、试验和错误,我设法使用 NAudio …
我CSCore.WasapiLoopbackCapture用来录制系统声音。但是当系统没有声音时,它根本不录音!例如,在播放音乐和录制音乐时,输出文件的持续时间小于曲目的持续时间。我希望它即使在系统中没有声音的情况下也能继续录制,但我没有找到任何属性来控制这种行为。这是我的代码片段:
WasapiCapture waveLoop = new WasapiLoopbackCapture();
waveLoop.Initialize();
waveLoop.DataAvailable += waveLoop_DataAvailable;
waveLoop.Stopped += waveLoop_Stopped;
waveLoop.Start();
Run Code Online (Sandbox Code Playgroud) 我想使用库NReplayGain来计算 MP3 文件的重播,然后使用TagLibSharp库(带有非官方开源重播支持修改)将ID3v2重播标签写入文件。
好吧,这应该是使用 NReplayGain 库计算样本集重放增益的伪代码,正如他们的网站所示:https : //github.com/karamanolev/NReplayGain
Dim trackGain As New TrackGain(samplerate, samplesize)
For Each sampleSet As SampleSet In track
trackGain.AnalyzeSamples(sampleSet.leftSamples, sampleSet.rightSamples)
Next
Dim gain As Double = trackGain.GetGain()
Dim peak As Double = trackGain.GetPeak()
Run Code Online (Sandbox Code Playgroud)
(...但如果我需要说实话,我不确切知道什么是 SampleSet(所有帧都加入了?))
试图计算sampleset的回放增益之前,我需要获得必要的数据,我需要传递给上面的代码,所以我需要得到的samplerate,SampleSet,leftSamples和rightSamples一个MP3文件。
我需要一个完整的代码示例,说明如何使用NAudiolib 或任何其他类型的 lib来检索这些数据。
我要求完整代码的原因是因为我知道我自己不能做到这一点,我在 NAudio 库之前接触了一些其他东西,对我来说非常困难,似乎libray 是专为音频大师程序员和音频大师编写的,没有任何简单的东西。