Tag: audio

录制某个应用程序的声音

我想知道有没有办法记录某个应用程序的声音? 我搜索了一段时间,但没有找到一些有用的信息。 所以现在我正在使用NAudio库来录制WASAPI环回和麦克风声音,将它们混合在一起并使用以下代码保存到mp3文件: Silence = new WaveOut(); Silence.Init(new SignalGenerator() { Gain = 0 }); Silence.Play(); SoundOut = new WasapiLoopbackCapture(); SoundOut.DataAvailable += SoundOut_DataAvailable; SoundOut.StartRecording(); SoundOutBuffer = new BufferedWaveProvider(SoundOut.WaveFormat); SoundIn = new WaveIn(); SoundIn.WaveFormat = SoundOut.WaveFormat; SoundIn.DataAvailable += SoundIn_DataAvailable; SoundIn.StartRecording(); SoundInBuffer = new BufferedWaveProvider(SoundIn.WaveFormat); List Sources = new List { SoundOutBuffer.ToSampleProvider(), SoundInBuffer.ToSampleProvider() }; Mixer = new MixingSampleProvider(Sources); […]

C#重新采样音频从8khz到44.1 / 48khz

我在DirectShow .NET中遇到了一个错误,我在其中创建了一个采样率为8khz的辅助缓冲区,并且在播放时,声音会在大约播放时播放。 改为8.1khz。 谷歌搜索这个,我发现我可能被迫将自己的8khz音频上采样到48khz或44.1khz,具体取决于PC中的声卡。 我可以使用任何C#库或通用算法吗? 谢谢!! Roey

Silverlight的音频输出

我正在寻找开发一个Silverlight应用程序,它将从Web服务器获取数据流(而不是音频流)。 然后操纵数据流以给出特定格式的音频(例如G.711a-Law),然后将其转换成PCM,以便可以应用附加效果(例如增大音量)。 到目前为止我还好。 我有我的数据,将G.711转换为PCM,但我的问题是能够将这个PCM音频输出到声卡。 我基于.Net应用程序的一些C#代码的解决方案,但在Silverlight中,尝试获取委托副本(函数指针)时出现问题,一旦我生成了一个简单的问题,这将成为单独问题的主题代码示例。 所以,问题是……如何将Silverlight中数据结构(当前是arrays)中保存的PCM音频输出给用户? (请不要说将字节值写入文本框) 如果它是一个MP3或WMA文件,我会使用MediaElement播放它,但我不想让它成为一个文件,因为这会给音频应用动态效果带来压力。 我已经看到一些人发帖说Silverlight中的低级音频支持很差/不存在,所以我对人们可能有的任何建议/想法持开放态度。

在IGraphBuilder.RenderFile中无法播放具有COMexception的MP3文件

我是新手直接展示开发。 我正在学习关于直接表演的事情。 我正在尝试编写播放一些音频文件的方法。 它适用于许多.mp3文件,但对于我的一些mp3文件,接口IGraphBuilder的方法RenderFile()抛出以下exception 发生COMException:“由于不支持相同的传输,引脚无法连接。” 我最好的猜测是我错过了一些编解码器来播放这些文件。 任何人都可以建议我做错了什么。 有没有办法选择可以播放这些文件的filter。 我可以用Windows Media Player播放这些文件,所以我相信我已经安装了编解码器。 任何帮助都将具有重要价值。 提前致谢。

是否可以在不同的API中关联相同的音频设备?

我正在使用winmm api来处理音频。 我正在使用waveInGetDeviceCaps和waveInMessage来唯一地标识“音频线”。 一切正常,但在Vista中,设备的名称由WaveInCaps结构WaveInCaps在32个字符中。 为了解决这个问题,我想要在操作系统版本> = Vista时使用核心API。 我正在使用IMMDeviceEnumerator.GetDevice和IMMDeviceEnumerator.EnumAudioEndpoints来收集音频线路信息,但我不知道如何判断核心api下的一个设备与waveXx api下的一个条目有关。 我想我可以比较两者的设备路径,但这将违背MS建议将设备路径字符串视为“不透明”。 你打算说什么?

如何在C#中读取.wav文件的比特率

鉴于我有一个.wav文件,在C#中读取其比特率属性的最佳方法是什么。 我试过Shell,并问了一个问题是“比特率”属性是否固定在索引28中? 没有asnwers所以。 此外,我现在相信Shell不是读取音频文件属性的最佳方式。 我研究过不同的开源媒体库,但是找不到多少。 TagLib#:这个工作正常,但有两个问题。 在比特率非常低(如小于30)的某些情况下,它不反映实际比特率,它只返回0.其次,我不确定是否可以将其用于商业用途。 许可证说http://opensource.org/licenses/LGPL-2.1 NAudio:只是不暴露任何属性来读取比特率,所以我必须计算它。 经过研究,我得到了这个公式来计算比特率。 bitrate = Samplerate * Channels * BitsPerSample。 这在大多数情况下都可以正常工作,但是如果某些.wav文件的BitsPerSample = 0则会失败。 是的文件绝对没问题,我可以播放,但BitsPerSample仍为0。 MediaInfo:再次没有直接属性,必须循环遍历音频文件的所有属性,然后搜索“整体比特率”。 而且必须在项目中添加两个dll,一个是.net包装器,另一个是实际的dll。 为这么长的总结道歉,但我不想问“嘿我怎么能得到音频文件的比特率”而不显示我已经做过的事情。 那么,如果你有一个.wav音频文件,你会用什么库/方法来获得比特率?

带均衡器的声音

几天后,我正在尝试使用C#创建均衡器。 看过NAudio相当多的时间,但我找不到任何适用于naudio的均衡器。 现在几天后,我终于在@stackoverflow,希望你知道一种使用c#创建均衡器的方法。 PS:我也尝试过System.Media.SoundPlayer。 但SoundPlayer甚至不支持任何与dsp有关的东西。 那么还有另一个音频库可以在外面使用“纯”音频吗?

在调整频率时,是否可以在C#中生成恒定声音?

是否有可能在C#中产生恒定的声音并随着它的频率操纵它的频率? 我试过这样的事情: for (int i = 500; i < 15000; i += 1) { Console.Beep(i, 500)); } 但是同步,循环等待每个蜂鸣声完成。 所以我尝试了这个: for (int i = 500; i Console.Beep(i, 500)).Start(); } 我认为这将是产生频率不断增加的恒定声音的开始。 然而,它仍然口吃。 有没有办法实现这一目标但更顺利?

为内存中的流创建有效的wav文件头

我有raw-headerless wav音频数据作为MemoryStream s。 Stream rawAudioStream = Producer.GetRawAudioFileStream(…); 我知道那些流数据格式: // WaveFormat(int rate, int bits, int channels); WaveFormat waveformat = new WaveFormat(8000, 16, 1); 我想要的是以编程方式为这些内存流添加正确的头信息,而无需将它们写入物理文件。 我怎样才能做到这一点? PS:我检查了NAudio库,但只找到了一种通过将流写入真实物理文件来创建标题的方法,这不适合我的情况 。 var waveformat = new WaveFormat(8000,16,1); var reader = new RawSourceWaveStream(rawAudioMemStream, waveformat); using (var convertedStream = WaveFormatConversionStream.CreatePcmStream(reader)) { WaveFileWriter.CreateWaveFile(fileName, convertedStream); } rawAudioMemStream.Close();

使用Naudio将每个WAV通道保存为单通道WAV文件

我正在尝试将WAV文件(PCM,48kHz,4通道,16位)转换为单通道WAV文件。 我尝试将WAV文件拆分成4个字节数组,就像这个答案一样,并创建了一个WaveMemoryStream,如下所示,但不起作用。 byte[] chan1ByteArray = new byte[channel1Buffer.Length]; Buffer.BlockCopy(channel1Buffer, 0, chan1ByteArray, 0, chan1ByteArray.Length); WaveMemoryStream chan1 = new WaveMemoryStream(chan1ByteArray, sampleRate, (ushort)bitsPerSample, 1); 我在创建WAVE标题时遗漏了什么? 或者更多的是将WAV分成单声道WAV文件?