gpt4 book ai didi

Delphi MediaPlayer 关于歌曲的通知已停止

转载 作者:行者123 更新时间:2023-12-02 09:41:30 25 4
gpt4 key购买 nike

我需要在 Delphi7 应用程序中嵌入一个简单的 MP3 播放器。我将简单地扫描一个目录并以随机顺序播放所有文件。

我发现了两种可能的解决方案:一种使用 Delphi MediaPlayer,另一种使用 PlaySound Windows API。

没有一个在工作。

问题似乎在于缺少“停止”通知。像这样使用 PlaySound:

playsound(pchar(mp3[r].name), 0, SND_ASYNC or SND_FILENAME);

我无法找到一种方法(礼貌地)要求 Windows 在歌曲停止播放时通知我。

使用 Delphi MediaPlayer,互联网上充满了从另一个复制/粘贴一个的建议,如下所示:

http://www.swissdelphicenter.ch/en/showcode.php?id=689

http://delphi.cjcsoft.net/viewthread.php?tid=44448

procedure TForm1.FormCreate(Sender: TObject);
begin
MediaPlayer1.Notify := True;
MediaPlayer1.OnNotify := NotifyProc;
end;

procedure TForm1.NotifyProc(Sender: TObject);
begin
with Sender as TMediaPlayer do
begin
case Mode of
mpStopped: {do something here};
end;
//must set to true to enable next-time notification
Notify := True;
end;
end;
{
NOTE that the Notify property resets back to False when a
notify event is triggered, so inorder for you to recieve
further notify events, you have to set it back to True as in the code.
for the MODES available, see the helpfile for MediaPlayer.Mode;
}

我的问题是,当一首歌结束时,我确实得到一个 NotifyValue == nvSuccessfull ,但当我开始一首歌曲时,我也得到一个 NotifyValue == nvSuccessfull ,所以我不能依赖它。此外,我从未收到过“mode”属性状态的更改,根据我发现的所有示例,该属性应该变为 mpStopped

这里有一个类似的问题

How can I repeat a song?

但它不起作用,因为如上所述,我收到了 nvSuccessfull 两次,没有办法区分开始和停止。

最后但并非最不重要的一点是,这个应用程序应该可以从 XP 到 Win10 运行,这就是我在 WinXP 上使用 Delphi7 进行开发的原因。

感谢您对这篇文章的篇幅表示抱歉,但在寻求帮助之前我确实尝试了很多解决方案。

最佳答案

要检测何时加载新文件进行播放,您可以使用 OnNotify 事件以及 TMediaPlayer 的 EndPosPosition 属性(以下简称MP)

首先设置MP并选择TimeFormat,例如

MediaPlayer1.Wait := False;
MediaPlayer1.Notify := True;
MediaPlayer1.TimeFormat := tfFrames;
MediaPlayer1.OnNotify := NotifyProc;

加载文件进行播放时,设置 EndPos 属性

MediaPlayer1.FileName := OpenDialog1.Files[NextMedia];
MediaPlayer1.Open;
MediaPlayer1.EndPos := MediaPlayer1.Length;
MediaPlayer1.Play;

以及OnNotify() 过程

procedure TForm1.NotifyProc(Sender: TObject);
var
mp: TMediaPlayer;
begin
mp:= Sender as TMediaPlayer;

if not (mp.NotifyValue = TMPNotifyValues.nvSuccessful) then Exit;

if mp.Position >= mp.EndPos then
begin
// Select next file to play
NextMedia := (NextMedia + 1) mod OpenDialog1.Files.Count;
mp.FileName := OpenDialog1.Files[NextMedia];
mp.Open;
mp.EndPos := mp.Length;
mp.Position := 0;
mp.Play;
// Set Notify, important
mp.Notify := True;
end;
end;

最后对您尝试使用 MP.Mode = mpStopped 模式更改为新歌曲的评论。当操作按钮时,模式会改变,例如当用户按下“停止”按钮时mpStopped。更改歌曲并开始播放可能不是用户所期望的。

关于Delphi MediaPlayer 关于歌曲的通知已停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46640579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com