2014-02-15 66 views
0

我有一個現有的程序,它使用.NET System.Media.SoundPlayer從存儲流中播放wav文件。我需要這樣做的原因是因爲wav文件在磁盤上進行了加密......我將它們解密爲內存流並將該流提供給播放器。它工作正常。如何使用NAudio從cryptoStream播放mp3?

但我寧願使用mp3 ...他們更小。我正在探索NAudio作爲解決方案,但無法弄清楚如何從密碼流播放mp3。

我目前使用來播放加密的wav文件的代碼是這樣的:

public void PlayEncMP3(String sourceFile) 
{ 
    FileStream input = new FileStream(sourceFile, FileMode.Open, FileAccess.Read); 
    DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider(); 
    cryptic.Key = ASCIIEncoding.ASCII.GetBytes("64BITKEY"); 
    cryptic.IV = ASCIIEncoding.ASCII.GetBytes("64BIT_IV"); 

    CryptoStream crStream = new CryptoStream(input, cryptic.CreateDecryptor(), CryptoStreamMode.Read); 

    MainPlayer = new SoundPlayer(crStream); 
    MainPlayer.Play(); 
} 

此代碼的工作非常完美。它打開加密的wav文件,將其解密,並將解密後的wav文件作爲內存流提供給播放器,後者通常播放wav文件。

我試着用NAudio(代碼取自這個問題:Play audio from a stream using C#),但代碼拋出一個異常,說cryptoStream不支持seek,所以它試圖創建blockAlignedStream失敗。

public void PlayEncMP3(String sourceFile) 
{ 
    //FileInfo info = new FileInfo(sourceFile); 
    FileStream input = new FileStream(sourceFile, FileMode.Open, FileAccess.Read); 
    DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider(); 
    cryptic.Key = ASCIIEncoding.ASCII.GetBytes("64BITKEY"); 
    cryptic.IV = ASCIIEncoding.ASCII.GetBytes("64BIT_IV"); 

    CryptoStream crStream = new CryptoStream(input, cryptic.CreateDecryptor(), CryptoStreamMode.Read); 

    using (WaveStream blockAlignedStream = 
     new BlockAlignReductionStream(
      WaveFormatConversionStream.CreatePcmStream(
       new Mp3FileReader(crStream)))) 
    { 
     using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) 
     { 
      waveOut.Init(blockAlignedStream); 
      waveOut.Play(); 
      while (waveOut.PlaybackState == PlaybackState.Playing) 
      { 
       System.Threading.Thread.Sleep(100); 
      } 
     } 
    } 
} 

任何想法如何讓這個工作?

編輯:我試圖完全消除塊對齊的流,只使用waveOut.Init中的cryptoStream(而不是blockAlignedStream),但它不能將cryptoStream轉換爲NAudio.Wave.IWaveProvider。

回答

0

不能使用Mp3FileReader沒有可搜索流,因爲它試圖首先建立一個目錄,它也支持在播放過程中重新定位。所以你需要首先將整個MP3讀取到一個內存流中,然後把它傳給Mp3FileReader。

+0

好吧,我修改了代碼以將cryptostream轉換爲內存流,並且工作... mp3播放聲音。然而,while循環播放這個遊戲永遠不會退出...... PlaybackState永遠不會從播放中改變。刪除while循環會導致聲音不能播放。有任何想法嗎? – user3313540