C#函数播放base64编码的mp3文件

Posted

技术标签:

【中文标题】C#函数播放base64编码的mp3文件【英文标题】:C# function to play base64 encoded mp3 file 【发布时间】:2015-10-25 19:56:57 【问题描述】:

我正在尝试创建一个函数PlaySoud,它接受一个 mp3 文件作为 base64 编码字符串并使用System.Media.SoundPlayer 播放它。

    static void Main(string[] args)
    
        var audioBytes = File.ReadAllBytes(@"PATH-TO-FILE");
        var base64String = Convert.ToBase64String(audioBytes);
        PlaySoud(base64String);
    

    static void PlaySoud(string base64String)
    
        var audioBuffer = Convert.FromBase64String(base64String);
        using (var ms = new MemoryStream(audioBuffer))
        
            var player = new System.Media.SoundPlayer(ms);
            player.Play();
        
    

我目前在行 player.Play() 上遇到异常,声明 The wave header is corrupt 并带有堆栈跟踪

at System.Media.SoundPlayer.ValidateSoundData(Byte[] data) at System.Media.SoundPlayer.LoadAndPlay(Int32 flags) at System.Media.SoundPlayer.Play() at POC.Program.PlaySoud(String base64String) in c:\Users\user\Documents\Visual Studio 2013\Projects\POC\POC\Program.cs:line 21 at POC.Program.Main(String[] args) in c:\Users\user\Documents\Visual Studio 2013\Projects\POC\POC\Program.cs:line 12 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()

关于这个错误的大多数 MSDN 讨论都指向将流位置重置为 0,但这并没有帮助。

您能否告诉我PlaySound 函数有什么问题?我对 mp3 文件进行编码或解码的方式是否存在问题?

【问题讨论】:

您的代码没有立即出现问题 - 很可能是“波头已损坏” - 从某种意义上说,您播放的是非 WAV 文件(即 MP3)。如果您实际上尝试播放 MP3(根据您的帖子似乎是这种情况),那么您尝试使用 SoundPlayer 而所有可以找到的文章 bing.com/search?q=c%23+play+mp3 都建议使用其他方式,这很奇怪。 编解码没问题。 SoundPlayer 类只接受 .wav 文件 我的错!我确实在尝试使用SoundPlayer 播放*.mp3 文件... :( 【参考方案1】:

SoundPlayer 类只能播放 .wav 文件。 - MSDN

您可以在应用中使用 WindowsMediaPlayer 播放 .mp3 文件以及许多其他格式。只需添加正确的引用,您就可以开始了。 (Help):

WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
wplayer.URL = "My MP3 file.mp3";
wplayer.controls.play();

更新:如果您需要从流中播放 mp3,请参阅 Play audio from a stream using C#。或者,您也可以创建一个临时文件并播放它。

【讨论】:

但是WMPLib 是否支持从流中播放(我不这么认为)?我真的想播放base64 编码的mp3 文件?

以上是关于C#函数播放base64编码的mp3文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将音频文件转为base64 编码

移动设备上的 HTML5 base64 编码音频

如何将音频 base64 字符串下载为 mp3 文件而不损坏它?

如何将音频文件转为base64 编码

用于上传的 Swift 3 base64 编码图像

如何使用 bash 脚本从 base64 转换的文件中播放声音?