Delphi: 启动MCI时出现EMCIDeviceError错误

7
我使用TMediaPlayer组件播放音乐,它可以正常播放大部分的音轨。但是,对于某些音轨却无法播放。当我想要播放这些音轨时,会显示以下错误信息:alt text。这是一条德语错误信息,大致意思是:在项目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;

这个不起作用。


打开“调试DCUs”链接器选项,并逐步执行“Play”方法,以查找触发Delphi引发异常的API错误代码。 - Rob Kennedy
我已经打开了“调试DCUs”,但是我不知道如何逐步执行“Play”方法!?我另外打开了MMSystem.pas文件。但是我该如何逐步执行它呢?编译时没有错误,但在运行时出现了问题。 - caw
你用什么工具来编码你的mp3文件? - Christopher Chase
我想知道明天会发生什么。OP有91个声望值,问题有200个声望值的赏金。 - idursun
1
据我所知,点数是在他开始悬赏时被移除的,而不是之后。即使没有接受答案,点数也会被移除。 - AlexV
一个大相册图片会导致问题。在我的情况下,441kb的图片就是如此。 - SHIN JaeGuk
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。

谢谢!你的代码不起作用。消息窗口(如上所示)仍然出现。我的当前WMP版本是11,但它与版本9也不兼容。有问题的MP3:http://rapidshare.com/files/364267687/cdc27b5901277bb54a3c67c8dc3e1a27.mp3.html - caw
try块应该捕获异常并弹出“无法播放!”的消息...它被捕获了吗? - AlexV

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文件呢?


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