当前位置: 首页 > 知识库问答 >
问题:

如何使用naudio从密码流中播放mp3?

公孙慎之
2023-03-14

我有一个现有的程序,它使用。NET System.Media.SoundPlayer从内存流中播放wav文件。我需要这样做的原因是因为wav文件在磁盘上是加密的...我将它们解密为一个内存流,并将该流提供给播放器。很好用。

但我宁愿用MP3...它们更小。我正在探索NAudio作为解决方案,但不知道如何从加密流中播放mp3。

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();
}
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。

共有1个答案

周高畅
2023-03-14

如果没有可搜索的流,你就不能使用Mp3FileReader,因为它试图首先构建一个目录,而且它还支持在播放过程中重新定位。因此,您需要先将整个MP3读入内存流,然后将其交给MP3FileReader。

 类似资料:
  • 我已经设法使用YouTubePlayer播放YouTube视频。然而,当我尝试使用YouTubePlayer播放直播流时,什么也没有发生。API支持播放实时流吗?如果是,我该怎么做?

  • 通过按暂停并重新播放,它再次正确工作,但我如何解决这个问题而不重新启动播放器? 提前谢了。

  • 问题内容: 我正在尝试编写一个将从Soundcloud URL播放mp3的python脚本 这是我已经做的: 我尝试了许多选项,例如更改格式,频道,费率。而且我只是从扬声器中听到奇怪的声音,我搜索了Google以播放mp3,但没有找到任何信息。 我尝试通过传递mp3中的字节来创建对象,然后仅执行play函数。我没有收到任何错误:脚本正在运行,但没有任何播放。 我正在使用Python 3和Ubunt

  • 我在服务器中创建了一个XML文件。它包含和标记。我获取标记并将它们作为链接显示在中。当用户点击链接时,我想播放电台应用程序中的文件。 下面是我的XML文件: 我不知道下一个活动中的链接怎么玩。 :

  • 我试着用两种语言播放一部电影。音频1至扬声器音频2至耳机 播放视频并混合音频1 用audio1播放视频 仅播放音频2 如何结合这一点?

  • 问题内容: 我想用Swift播放声音。 我的代码在Swift 1.0中可用,但现在在Swift 2或更高版本中不再起作用。 问题答案: 最可取的是,您可能想使用 AVFoundation。它提供了使用视听媒体的所有必要条件。 更新: 某些评论中建议与 Swift 2 , Swift 3 和 Swift 4 兼容。 斯威夫特2.3 迅捷3 Swift 4(与iOS 13兼容) 确保更改乐曲的名称以及