标签: naudio

使用C#播放流中的音频

C#中是否有一种方法可以直接从System.IO.Stream播放音频(例如MP3),例如从WebRequest返回而不将数据临时保存到磁盘?


NAudio的解决方案

NAudio 1.3 的帮助下,可以:

  1. 将URL中的MP3文件加载到MemoryStream中
  2. 完全加载后,将MP3数据转换为波形数据
  3. 使用NAudio的WaveOut类播放波形数据

如果能够播放半载MP3文件本来不错,但由于NAudio库设计,这似乎是不可能的.

这是完成工作的功能:

    public static void PlayMp3FromUrl(string url)
    {
        using (Stream ms = new MemoryStream())
        {
            using (Stream stream = WebRequest.Create(url)
                .GetResponse().GetResponseStream())
            {
                byte[] buffer = new byte[32768];
                int read;
                while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
            }

            ms.Position = 0;
            using (WaveStream blockAlignedStream =
                new BlockAlignReductionStream(
                    WaveFormatConversionStream.CreatePcmStream(
                        new Mp3FileReader(ms))))
            {
                using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
                { …
Run Code Online (Sandbox Code Playgroud)

.net audio mp3 stream naudio

96
推荐指数
3
解决办法
14万
查看次数

流包装器使Stream可以搜索?

我有一个System.IO.Stream不可搜索的只读实现(并且它Position总是返回0).我需要将它发送给Seek在流上执行某些操作(也就是设置位置)的消费者.这不是一个巨大的寻求 - 比如当前位置的+/- 100.是否有现有的Stream包装器可以为流添加缓冲功能以进行简单的Seek操作?

更新:我应该补充说我的消费者是NAudio Mp3FileReader.我真的只需要一种播放(缓慢且无限期)流式MP3的方法.我认为这是一个错误,NAudio希望能够随意寻找他们的数据源.

.net c# stream seek naudio

19
推荐指数
2
解决办法
1万
查看次数

naudio从麦克风录制声音然后保存

我在使用naudio和保存录音方面遇到了一些问题.我目前使用的代码可以保存wav文件,但是当我打开它时,Windows Media Player会返回错误:"Windows Media Player在播放文件时遇到问题"

我有两个按钮,一个"记录"按钮,在按下后变成停止按钮.我有一个"保存"按钮,单击该按钮可将录像保存到sample.wav.

NAudio.Wave.WaveIn sourceStream = null;
NAudio.Wave.DirectSoundOut waveOut = null;
NAudio.Wave.WaveFileWriter waveWriter = null;

private void recordButton_Click(object sender, EventArgs e)
{
    int deviceNumber = sourceList.SelectedItems[0].Index;

    sourceStream = new NAudio.Wave.WaveIn();
    sourceStream.DeviceNumber = deviceNumber;
    sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels);

    NAudio.Wave.WaveInProvider waveIn = new NAudio.Wave.WaveInProvider(sourceStream);

    waveOut = new NAudio.Wave.DirectSoundOut();
    waveOut.Init(waveIn);

    sourceStream.StartRecording();
    waveOut.Play();

    recordButton.Visible = false;
    stopRecord.Visible = true;
}

private void saveResponse_Click(object sender, EventArgs e)
{
    int deviceNumber = sourceList.SelectedItems[0].Index;

    string saveLocation = "c:\\wav\\sample.wav";

    sourceStream = new …
Run Code Online (Sandbox Code Playgroud)

c# naudio

12
推荐指数
1
解决办法
3万
查看次数

NAudio音高变换

我正在使用NAudio DLL,我正在寻找音调转换声音的示例代码.

.net audio signal-processing naudio pitch-shifting

11
推荐指数
1
解决办法
3531
查看次数

NAudio分割mp3文件

我是音频或mp3的新手,正在寻找一种方法来在C#,asp.net中分割一个mp3文件.谷歌搜索了3天没有太大的帮助,我希望有人能指出我正确的方向.

我可以用NAudio来完成这个吗?有没有示例代码?提前致谢.

c# asp.net mp3 split naudio

11
推荐指数
3
解决办法
1万
查看次数

.NET中的精确计时

我刚看到这个问题,其中一个答案表明System.Diagnostics.Stopwatch只能用于诊断性能而不能用于生产代码.

在这种情况下,什么是在.NET中获得精确计时的最佳方法?我目前正处于使用NAudio的MIDI输出功能构建一个非常简单的MIDI音序器的早期阶段.我希望能够以尽可能小的抖动将MIDI消息发送到(例如)1/10s.这是可行的,还是像上下文切换这样的事情毁了我的一天?

我目前在控制台应用程序中有一些代码,Stopwatch在150bpm生成1/16笔记流时不断调用和计算抖动.在这种情况下抖动非常低.但是,我将把它移到另一个线程,所以我不知道是否仍然如此.

.net c# midi timing naudio

10
推荐指数
1
解决办法
2822
查看次数

检测歌曲中的节拍

我正在开发一个项目,要求我在应用程序中播放歌曲时添加节拍检测(WinForms - C#).

我目前正在使用NAudio.NET播放歌曲并显示有关该歌曲的详细信息.

是否有一个库允许我这样做或以某种方式手动检测这个?我不期待一个完成的解决方案,但指向正确的方向.理想情况下,我希望这是一个实时检测,但它不是必需的.

.net c# naudio winforms

10
推荐指数
1
解决办法
1万
查看次数

如何使用NAudio播放MP3文件

WaveStream waveStream = new Mp3FileReader(mp3FileToPlay);
var waveOut = new WaveOut();
waveOut.Init(waveStream); 
waveOut.Play();
Run Code Online (Sandbox Code Playgroud)

这引发了一个异常:

WaveBadFormat调用waveOutOpen

编码类型是"MpegLayer3"作为NAudio.

我怎么能用NAudio播放mp3文件?

c# mp3 naudio

9
推荐指数
2
解决办法
2万
查看次数

在NAudio的内存流中将格式从wav更改为mp3

嗨,我试图在内存流中将文本转换为语音(wav)将其转换为mp3,然后在用户页面上播放.所以我需要帮助下一步做什么?

这是我的asmx代码:

[WebMethod]
public byte[] StartSpeak(string Word)
{
    MemoryStream ms = new MemoryStream();
    using (System.Speech.Synthesis.SpeechSynthesizer synhesizer = new System.Speech.Synthesis.SpeechSynthesizer())
    {
        synhesizer.SelectVoiceByHints(System.Speech.Synthesis.VoiceGender.NotSet, System.Speech.Synthesis.VoiceAge.NotSet, 0, new System.Globalization.CultureInfo("en-US"));
        synhesizer.SetOutputToWaveStream(ms);
        synhesizer.Speak(Word);
    }
    return ms.ToArray();

    }
Run Code Online (Sandbox Code Playgroud)

谢谢.

c# asp.net audio naudio

9
推荐指数
3
解决办法
3万
查看次数

如何在PC中区分耳机与集成音频

我正在使用惊人的NAudio框架来获取音频设备列表.

但正如我所看到的那样,音频设备是PC的集成音频和耳机是不可能的.我的意思是他们有相同的名字,只有当我们插入耳机它才会进入Active状态.

想象一下,如果我使用插入式耳机启动应用程序,我如何知道当前设备是耳机而不是PC的集成音频?

我的意思是我们可以通过NAduio检测到插入的音频设备是外部音频设备并且是耳机本身吗?

var enumerator = new NAudio.CoreAudioApi.MMDeviceEnumerator();

// Allows you to enumerate rendering devices in certain states
var endpoints = enumerator.EnumerateAudioEndPoints(
    DataFlow.Render,
    DeviceState.Unplugged | DeviceState.Active);
foreach (var endpoint in endpoints)
{
    Console.WriteLine("{0} - {1}", endpoint.DeviceFriendlyName, endpoint.State);
}

// Aswell as hook to the actual event
enumerator.RegisterEndpointNotificationCallback(new NotificationClient());
Run Code Online (Sandbox Code Playgroud)

NotificationClient的实现方式如下:

class NotificationClient : NAudio.CoreAudioApi.Interfaces.IMMNotificationClient
{
    void IMMNotificationClient.OnDeviceStateChanged(string deviceId, DeviceState newState)
    {
        Console.WriteLine("OnDeviceStateChanged\n Device Id -->{0} : Device State {1}", deviceId, newState);
    }

    void IMMNotificationClient.OnDeviceAdded(string pwstrDeviceId) …
Run Code Online (Sandbox Code Playgroud)

c# naudio headphones audio-device naudio-framework

9
推荐指数
1
解决办法
606
查看次数