【问题标题】:How to play mp3 from a cryptoStream using NAudio?如何使用 NAudio 从 cryptoStream 播放 mp3?
【发布时间】:2014-03-14 23:27:45
【问题描述】:

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

【问题讨论】:

    标签: .net audio encryption mp3 naudio


    【解决方案1】:

    您不能在没有可搜索流的情况下使用 Mp3FileReader,因为它会首先尝试构建目录,并且它还支持在播放期间重新定位。因此,您需要先将整个 MP3 读入内存流,然后将其提供给 Mp3FileReader。

    【讨论】:

    • 好的,我修改了代码以将加密流转换为内存流,并且工作正常...... mp3 播放声音。但是,播放之后的 while 循环永远不会退出...... PlaybackState 永远不会从 Playing 改变。删除 while 循环会导致声音根本不播放。有什么想法吗?
    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多