4

Windows 7/2008のサービスからサウンドファイル(wavまたはmp3で問題ありません)を再生する必要があります...WinXPで実行した方法は機能しなくなりました。この質問に続いて、Windowsサービス(C#)からwaveファイルを再生しまし たが、さまざまな組み合わせで成功しませんでした。デバッガーを介してサウンドは正常に再生されますが、サービスとしてインストールすると再生されず、イベントログによって呼び出しが行われていることが証明されます。http://bresleveloper.blogspot.co.il/2012/06/c-service-play-sound-with-naudio.htmlリンクもたどったところ、同じ結果になりました。

コードスニペットは以下のとおりです。これは、VS 2010、.Net 4.0、NAudio 1.5.4.0を使用したC#サービスです。InstallUtilを使用してサービスをインストール/削除しています。

コードをWRTし、WavまたはMP3のものと、毎回メソッドの1つをコメントアウトします...それらはすべて正常にサウンドを再生します。

    static class Program
    {
        [DllImport("kernel32.dll")]
        public static extern Boolean AllocConsole();

        static void Main(string[] args)
        {
            m_eventLog = new EventLog();
            m_eventLog.Source = "EventLoggerSource";

            if(args.Length > 0 && args[0].ToLower() == "/console")
            {
                AllocConsole();
                EventLoggerApp app = new EventLoggerApp();
                app.Start();

                m_eventLog.WriteEntry("INFO (Calling Player)");
                string fileFullPath=@"c:\aaasound\bunny_troubles.wav",fileFullPath2=@"c:\aaasound\dreams.mp3";

                // Wav file
                IWavePlayer wavePlayer=new WaveOutEvent();  // Method 1
                IWavePlayer wavePlayer=new WasapiOut(NAudio.CoreAudioApi.AudioClientShareMode.Shared,false,100); // Method 2   
                AudioFileReader audioFile=new AudioFileReader(fileFullPath);
                audioFile.Volume = (float)1.0;
                wavePlayer.Init(audioFile);

                // MP3 file
                IWavePlayer wavePlayer=new WasapiOut(NAudio.CoreAudioApi.AudioClientShareMode.Shared,true,100); // Method 1- EventSync/not both work
                IWavePlayer wavePlayer=new WasapiOut(NAudio.CoreAudioApi.AudioClientShareMode.Exclusive,false,100); // Method 2- EventSync must be false or throws an exception
                WaveStream mp3Reader = new Mp3FileReader(fileFullPath2);
                WaveChannel32 inputStream=new WaveChannel32(mp3Reader);
                WaveStream wavStream=new WaveChannel32(inputStream);
                wavePlayer.Init(wavStream);

                //this.wavePlayer.PlaybackStopped += new EventHandler(wavePlayer_PlaybackStopped);
                wavePlayer.Play();
                while(wavePlayer.PlaybackState == PlaybackState.Playing)
                {
                    Thread.Sleep(100);
                }
4

0 に答える 0