C# Windows 窗体中的 WMP 在显示 GIF 后停止播放声音

Posted

技术标签:

【中文标题】C# Windows 窗体中的 WMP 在显示 GIF 后停止播放声音【英文标题】:WMP in C# Windows Form stops playing sound after displaying GIF 【发布时间】:2017-01-11 07:22:12 【问题描述】:

我正在制作一个 Windows 窗体应用程序,它应该在播放音乐时播放动画 gif。

我使用了 SoundPlayer,一切正常。然后我发现我无法使用 SoundPlayer 播放多个音频文件,这是一个问题(需要背景音乐和效果)。

所以我稍微研究了一下 DirectSound,但每次我执行与 DirectSound 相关的任何操作(设备、缓冲区...)时,我的应用程序都会冻结。

所以现在我正在尝试 WMP,起初我很高兴,但是当我启用 GIF(透明,以防万一)时,音乐在不到一秒的时间内停止,而你可以看到 GIF 停止一个框架左右,就像它正在加载重物。每次同时播放音频和 GIF 时都会发生这种情况,无论其中一个是否提前开始。当我使用 SoundPlayer 时,我可以一次播放 20 个动画 GIF,而不会影响音频。

总结一下:

SoundPlayer = 只有一个音频文件,不可接受

DirectSound = 由于某种原因冻结(也许值得再试一次?不过我想把这个问题的重点放在 WMP 上,反正我丢失了代码)

WMP = 不能很好地配合动画 GIF,这是必需的。

我尝试播放 .wav 和 .mp3 文件,没有区别。 我之前添加了 wmp.dll 引用。

using System;
using System.Windows.Forms;
using System.Media;           

private void button2_Click(object sender, EventArgs e)
            
                var player = new WMPLib.WindowsMediaPlayer();
                player.URL = "song.wav";
                pictureBox1.Visible = true;
            

关于 WMP 有什么我应该知道的吗?你能推荐一些其他的方法吗?当处理达到一定的内存使用率时,音频似乎停止了。它稳定在大约 45 MB,但是一旦我播放音频文件,它就会开始增加,并一直播放到大约 48 MB,然后停止并返回到 45 MB。

感谢您抽出宝贵时间并以任何方式帮助我。

编辑:我使用的是分辨率为 500x500 的 GIF 图片,我使用 SizeMode=StretchImage 使其看起来更小(200x200)。在这种情况下,音乐播放了大约 0.2 秒。我将资源图片的大小调整为 100x100,使用 StretchImage 使其再次显示为 200x200,音乐播放大约 8 秒,如果我一次加载两个 GIF,大约 4 秒。更改 .mp3 比特率使其只有 170KB 根本没有帮助。我的意思是我的谷歌浏览器占用了我 3GB 的内存并且仍然可以正常播放多个视频,而我的表单甚至不占用 50MB 并且很挣扎。当然,必须有一种播放 GIF 和歌曲的方法。是否有某种 MemoryAssignLimit 属性?或者当涉及到更大的资源时,WMP 是否会失败?是不是WinForms设置的限制?

【问题讨论】:

【参考方案1】:

遵循this 解决方案,它就像魅力一样,到处都是 GIF 和 30 首重叠的歌曲,除非我愿意,否则什么都不会停止。太好了。

【讨论】:

以上是关于C# Windows 窗体中的 WMP 在显示 GIF 后停止播放声音的主要内容,如果未能解决你的问题,请参考以下文章

第一章 C#入门 (Windows窗体应用程序)

在 c# 中使用文本框中的数据库值打开特定的 Windows 窗体

C# windows窗体中的文本框到数组声明

C#如何在一个窗体显示另一个窗体的文本内容

如何在 Windows 窗体 C# 中单击按钮通过 DataGridView 更新数据库中的布尔字段

显示后的 Windows 窗体不透明度 - C#