使用 naudio 播放 .wav 文件,播放在 1 秒后停止

Posted

技术标签:

【中文标题】使用 naudio 播放 .wav 文件,播放在 1 秒后停止【英文标题】:Playing a .wav file using naudio, playback stops after 1 sec 【发布时间】:2010-12-08 19:24:07 【问题描述】:

我在 C# 中使用 naudio 库并想播放一个简单的文件。问题是,播放在 1 秒后停止。我不知道为什么会这样。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NAudio.Wave;

namespace NAudioTest

    class Program
    
        static IWavePlayer waveout;
        static WaveStream outputStream;
        static string filename = null;

        static void Main(string[] args)
        
            waveout = new WaveOut();

            filename = "C:\\1.wav";

            outputStream = CreateInputStream(filename);

            try
            
                waveout.Init(outputStream);
            
            catch (Exception ex)
            
                Console.WriteLine("Error while loading output");
                Console.WriteLine("Details: " + ex.Message);
                Console.ReadLine();
                return;
            

            Console.WriteLine("Press [Enter] to start playback");
            Console.ReadLine();

            waveout.Play(); //this stops after 1 sec. should it play until i hit enter cause of the next line?

            Console.WriteLine("Press [Enter] to abort");
            Console.ReadLine();
            waveout.Dispose();
            Console.ReadLine();
        


        static WaveStream CreateInputStream(string name)
        
            WaveChannel32 inputStream;
            if (name.EndsWith(".wav"))
            
                WaveStream readerStream = new WaveFileReader(name);
                if (readerStream.WaveFormat.Encoding != WaveFormatEncoding.Pcm)
                
                    readerStream = WaveFormatConversionStream.CreatePcmStream(readerStream);
                    readerStream = new BlockAlignReductionStream(readerStream);
                

                if (readerStream.WaveFormat.BitsPerSample != 16)
                
                    var format = new WaveFormat(readerStream.WaveFormat.SampleRate, 16, readerStream.WaveFormat.Channels);
                    readerStream = new WaveFormatConversionStream(format, readerStream);
                
                inputStream = new WaveChannel32(readerStream);
            
            else
            
                throw new InvalidOperationException("Invalid extension");
            
            return inputStream;
        
    

【问题讨论】:

"Press [Enter] to abort" 开始播放时你看到了吗? 可以使用System.Media.SoundPlayer,除非您使用演示应用程序来验证更大应用程序的代码。 对不起,代码中的一段调试代码是我测试过的,我更正了。 @mark,是的,我在播放 1 秒时看到了它。 【参考方案1】:

如果您尝试从控制台应用播放音频,则需要确保使用函数回调,因为 WaveOut 的默认设置是使用窗口回调。

new WaveOut(WaveCallbackInfo.FunctionCallback())

更新:对于较新版本的 NAudio,我现在建议您避免使用函数回调,因为它们可能会导致某些驱动程序出现死锁。相反,使用事件回调和后台线程的WaveOutEvent 是首选机制:

new WaveOutEvent()

【讨论】:

以上是关于使用 naudio 播放 .wav 文件,播放在 1 秒后停止的主要内容,如果未能解决你的问题,请参考以下文章

Naudio:如何播放 MP3 和 WAV 文件?

NAudio - wav 的流式字节 [] 使其播放缓慢

使用 NAudio 转换为 WAV 后使用 SoundPlayer 播放 MP3

在播放 mp3 或 wav 时结合 NAudio Pan 和 JSNet SuperPitch

HRESULT:尝试使用 NAudio 库播放 mp2 编码的 wav 文件时出现 0xC00D5212

使用 NAudio 从内存流中播放 .wma