我有一个现有的程序,它使用.NET System.Media.SoundPlayer从内存流中播放wav文件。我需要这样做的原因是因为wav文件在磁盘上加密...我将它们解密为内存流并将该流提供给播放器。它工作正常。
但我宁愿使用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不支持搜索,所以它无法尝试创建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 :(得分:0)
你不能在没有可搜索流的情况下使用Mp3FileReader,因为它首先尝试构建目录,并且还支持在回放期间重新定位。因此,您需要首先将整个MP3读入内存流,然后将其提供给Mp3FileReader。