Frage

Ich bin mit dem NAudio lib in C # und möchte eine einfache Datei spielen. Das Problem ist, die Wiedergabe stoppt nach 1 Sekunde. Ich kann den Grund herauszufinden, warum es das tut.

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;
        }
    }
}
War es hilfreich?

Lösung

Sie müssen sicherstellen, dass Sie Funktion Rückrufe verwenden, wenn Sie versuchen, Audio von einer Konsolenanwendung zu spielen, da der Standard für WaveOut ist Fenster Rückrufe zu verwenden.

new WaveOut(WaveCallbackInfo.FunctionCallback())

Update: Bei neueren Versionen von NAudio ich jetzt empfehlen, dass Sie Funktion Rückrufe zu vermeiden, wie sie Deadlocks mit bestimmten Treibern verursachen können. Stattdessen die WaveOutEvent verwendet Ereignisrückrufe und ein Hintergrund-Thread ist der bevorzugte Mechanismus:

new WaveOutEvent()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top