如何重复播放一首歌曲?

4
我有一个名为MediaPlayer1的TMediaPlayer。我打开一个文件(一首歌曲)并播放它。 现在我的问题是,我需要这首歌曲重复播放,直到程序停止。
思路是当窗体激活时,重复播放指定的歌曲,直到关闭窗体。
MediaPlayer1.Filename := 'filename';

然后它打开它。
MediaPlayer1.Open;

然后它会播放它。
MediaPlayer1.Play;

现在歌曲正在播放,但当它结束时,我希望它能重复播放,直到表单被关闭。

我尝试了David Heffernan说的方法,但它不起作用,我想我做错了什么,有人可以帮我纠正吗?

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, MPlayer, StdCtrls;

type
  TForm1 = class(TForm)
    MediaPlayer1: TMediaPlayer;
    Label1: TLabel;
    procedure FormActivate(Sender: TObject);
    procedure MediaPlayer1Notify(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
 mediaplayer1.FileName:='E:\it project\mario.mid';
 mediaplayer1.Open;
 mediaplayer1.AutoRewind:=true;
 mediaplayer1.Play;
 mediaplayer1.Notify:=true;
end;

procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
  if MediaPlayer1.NotifyValue=nvSuccessful then begin
    MediaPlayer1.Play;  
    MediaPlayer1.Notify := True;
  end;
end;
end.

1
Delphi 没有音乐。我猜你有一些代码可以播放它一次。如果你想重复播放,可能你已经想出了如何播放它的方法。但是你没有告诉我们怎么做。我们无法猜测。请提供更多详细信息。 - David Heffernan
抱歉,现在是晚上11点,我累得要命。我已经编辑过了,希望现在更有意义了。 - Craig
3
你的修改更好了。我注意到你没有使用任何大写字母。你所有的"I"都是小写的。如果你希望我们关心你的问题,那么你应该真正关心如何提出问题。 - David Heffernan
有什么想法可以在FireMonkey中循环播放媒体,因为TMediaPlayer没有Notify事件? - Alain V
2个回答

8

您需要自行设置自动重复播放。

为媒体播放器创建一个OnNotify事件。当歌曲播放完成时,此事件将触发。

procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
  if MediaPlayer1.NotifyValue=nvSuccessful then begin
    //restart the song
    MediaPlayer1.Play;  
    MediaPlayer1.Notify := True;//ensures we are notified when song completes
  end;
end;

开始歌曲的代码需要像这样:

启动歌曲的代码应该如下所示:

MediaPlayer1.AutoRewind := True;//for obvious reasons
MediaPlayer1.Play;
MediaPlayer1.Notify := True;//ensures we are notified when song completes

我尝试了这个,但是没有成功,我觉得我做错了什么。请检查我的编辑。 - Craig
它是有效的。你问题中的代码,就像我的答案中的代码一样有效。可能你忘记在IDE中连接这两个事件处理程序了。让我们看看你的.dfm文件长什么样子。 - David Heffernan
@thanh 不,事件仍然像以前一样存在。我猜你正在使用FMX。 - David Heffernan
是的 @david,你说得对,我正在使用FMX,这个属性是针对VCL表单的吗?我无法设置MediaPlayer1.notify := True;。 - thanh
谢谢 @david,我会在 FMX 中找另一种方法来完成这个操作,也许使用一个计时器。 - thanh
显示剩余6条评论

-1

我认为它没有重复功能。 - Craig
1
只需使用 OnNotify 事件来回复歌曲(或一组歌曲)结束时:http://www.delphipages.com/forum/archive/index.php/t-96813.html - paulsm4
@paulsm4 这条评论应该成为答案的一部分,因为它是手头问题的关键。 - David Heffernan
你的回答并没有回答到关于使用TMediaPlayer组件的问题。实际上,你只是告诉他继续使用他已经在使用的东西。 - TomC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接