• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

如何使用NAudio从cryptoStream播放mp3?

.net 来源:user3313540 3次浏览

我有一个现有的程序,它使用.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。

===========解决方案如下:

不能使用Mp3FileReader没有可搜索流,因为它试图首先建立一个目录,它也支持在播放过程中重新定位。所以你需要首先将整个MP3读取到一个内存流中,然后把它传给Mp3FileReader。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)