delphi - 如何让 TWindowsMediaPlayer 在旧轨道播放完毕后播放新轨道?

标签 delphi windows-media-player

我正在使用 TWindowsMediaPlayer,但遇到了问题。当前歌曲播放完毕后,我无法让它加载新歌曲然后播放。

procedure TMainWinForm.WMPlayer1PlayStateChange(Sender: TObject;
          NewState: Integer);
  begin
    if (NewState = wmppsMediaEnded) then
      begin
        WMPlayer1.URL := FileScanner.SelectSong;
        writeln('Play triggered on ', String(WMPlayer1.URL));
        WMPlayer1.controls.Play;  // DOES NOT PLAY THE SONG!
      end;
  end;

这会加载歌曲,但需要额外的用户干预才能实际播放它。我让它继续的唯一方法是检查 wmppsStopped,但该事件发生两次,所以我得到列表中的每首奇数编号的歌曲。

关于如何使其正常工作有什么想法吗?

最佳答案

我得到了一个似乎有效的答案。由于 TWindowsMediaPlayer 似乎是异步操作的,因此您无法在不允许其他事件的情况下使用方法触发事件。为此,我的猜测是它拒绝播放方法,因为媒体未正确加载。

procedure TMainWinForm.WMPlayer1OpenStateChange(Sender: TObject;
  NewState: Integer);
begin
  if NewState = wmposMediaOpen then
    begin
      WMPlayer1.controls.play;
    end;
end;

procedure TMainWinForm.WMPlayer1PlayStateChange(Sender: TObject;
  NewState: Integer);
begin
  if (NewState = wmppsStopped) and (SpecialPlayListMode) then
    begin
      WMPlayer1.URL := FileScanner.SelectSong;
    end;
end;

尽管这并不能解释为什么我可以在播放其他内容时更改 URL,并且可以毫无问题地播放它...

关于delphi - 如何让 TWindowsMediaPlayer 在旧轨道播放完毕后播放新轨道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16599148/

相关文章:

android - Android下使用TImage时低质量delphi用户界面设计

android - Delphi Android - 检测设备方向变化

android - 注册。 delphi中Android应用程序的大小

c# - 如何拖放到 Windows Media Control

delphi - 如何对齐 Windows Media Player 控件以适应父窗口?

delphi - 调用外部函数给出不满足的前向或外部声明

delphi - 如何在 Windows 7 系统菜单的 "Open with..."部分添加应用程序?

java - 在 Windows Media Player 中获取当前正在播放的媒体

windows - 视频卡在 Perl 脚本中的 system(1, @commands) 上

winforms - 当 AxWindowsMediaPlayer 关闭时,出现 AccessViolation 异常