7

我使用 TMediaPlayer 组件播放音乐。

它适用于我的大部分曲目。但它不适用于某些曲目。当我想播放它们时,会显示以下错误消息:

替代文字

这是德语,但大致意思是:

在项目 pMusicPlayer.exe 中发生了 EMCIDeviceError 类的异常。消息:“启动 MCI 时出错。”。进程已停止。继续“单个命令/语句”或“开始”。

调用TMediaPlayer的“Play”过程后程序直接退出。

例如,以下文件发生此错误:

  • 文件大小:7.40 MB
  • 时长:4:02 分钟
  • 比特率:256 kBit/s

我用 128 kBit/s 的比特率对这个文件进行了编码,因此文件大小为 3.70 MB:它工作正常!

第一个文件有什么问题?Windows Media Player 或其他程序可以毫无问题地播放它。

Delphi 的 TMediaPlayer 是否有可能无法处理大文件(例如 > 5 MB)或高比特率文件(例如 > 128 kBit/s)?

我能做些什么来解决这个问题?

附加问题: 为什么我不能使用 try/except 来阻止消息窗口?

  try
    Player.Play;
  except
    showmessage('Cannot be played');
  end;

这行不通。

4

2 回答 2

2

好的,我找到了问题的根源。我使用这个小的Delphi MP3 播放器教程(你可以在那里下载项目)来测试你的 MP3 文件,我得到了和你的 MP3 一样的错误。

经过一些测试后,我发现其他 MP3 文件与该教程应用程序配合得很好。您的 MP3 与 Windows Media Player 和其他多媒体播放器配合得很好。

是的,重新编码文件可以解决问题,但这不是真正的问题。问题来自 MP3 的元数据(ID3 标签),而不是声音编码本身。

我使用Mp3tag 仅删除文件上的标签,之后一切正常,没有 EMCIDeviceError。

似乎 TMediaPlayer 可能会因某种格式的元数据而崩溃。在我的搜索过程中,我还看到了包含嵌入 JPEG 封面的 MP3 文件的 TMediaPlayer 错误报告。

大多数在我查看的论坛上回答有关 TMediaPlayer 的错误的人都说 TMediaPlayer 确实过时并且通常很糟糕(我认为它已经有 10 年没有更新了)。如果您想在您的应用程序中获得强大的 MP3 支持,请考虑使用另一个组件。您也可以在 Delphi 应用程序中使用 Windows Media Player ActiveX。

对于您有关 try/except 的其他问题,请尝试以下操作:

try
    //load & play here
except
    on E:Exception do
        ShowMessage('Cannot be played! ' + E.Message);
end;

或者如果没有发现错误,请考虑使用 TApplicationEvents。

于 2010-03-16T20:14:35.487 回答
1

您是否尝试过在表单上放置 TApplicationEvents 控件并处理 OnException 事件。

procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
  E: Exception);
begin
  if E is EMCIDeviceError  then
    begin
     MessageDlg('Cannot be played, '+ e.message, mtError, [mbOK], 0)
     //Or Do Nothing...
    end else
     MessageDlg(e.message, mtError, [mbOK], 0);
end;

例外是在公开赛上引发的,而不是在比赛上引发的。因此,如果您可以更改代码以在打开的过程中捕获异常。

  MediaPlayer2.filename :='';
  try
    MediaPlayer2.Open;
  except
   on E: Exception do
    MessageDlg('Can not be opened, '+ E.message, mtError, [mbOK], 0);
  end;
  if MediaPlayer2.Error = 0 then
    MediaPlayer2.play;

我使用winlame重新编码了 mp3 ,它可以工作。你用什么来编码你的mp3?

于 2010-03-16T23:18:54.333 回答