我需要在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 但是当我开始播放歌曲时,我也不能依赖它。 此外,我永远不会改变"模式的状态"属性,根据我找到的所有例子,应该成为 mpStopped 。
这里有一个类似的问题
但它不起作用,因为如上所述,我收到了两次nvSuccessfull,没有办法区分开始和停止。
最后但同样重要的是,这款应用应该可以在XP到Win10之间运行,这就是我在WinXP上使用Delphi7进行开发的原因。
谢谢你,对于这篇文章的篇幅感到抱歉,但在寻求帮助之前,我确实尝试了很多解决方案。
答案 0 :(得分:2)
要检测何时加载新文件以进行播放,您可以使用OnNotify
事件以及TMediaPlayer的EndPos
和Position
属性(以下称为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
模式更改为新歌曲。操作按钮时模式改变,当用户按下停止按钮时,{i} mpStopped
。更改歌曲并开始播放可能不是用户所期望的。