代码之家  ›  专栏  ›  技术社区  ›  caw

Delphi:启动MCI时出错

  •  4
  • caw  · 技术社区  · 14 年前

    我使用tmediaplayer组件来播放音乐。

    它对我的大部分音轨都很好。但有些音轨不行。当我想播放它们时,将显示以下错误消息:

    alt text http://i42.tinypic.com/vervci.jpg

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

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

    程序在调用tmediaplayer的“play”过程后直接退出。

    以下文件出现此错误,例如:

    • 文件大小:7.40 MB
    • 持续时间:4:02分钟
    • 比特率:256kbit/s

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

    第一个文件怎么了?Windows Media Player或其他程序可以正常播放。

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

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

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

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

    这不管用。

    2 回复  |  直到 6 年前
        1
  •  2
  •   AlexV    14 年前

    好的,我找到了问题的根源。我用这个小的 Delphi MP3 Player Tutorial (你可以 download project there )为了测试你的mp3文件,我得到了与你的mp3相同的错误。

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

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

    我用过 Mp3tag 只有 移除文件上的标签,之后一切都很好,没有emcideviceerror。

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

    在我看过的论坛上,大多数人都在回答人们关于tmediaplayer的错误,他们说tmediaplayer已经过时了,而且通常都很糟糕(我认为它已经10年没有更新了)。如果您想在应用程序中获得强大的MP3支持,请考虑使用 another component . 您也可以在Delphi应用程序中使用Windows Media Player ActiveX。

    关于try/except的其他问题,请尝试以下内容:

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

    或者考虑使用tapplicationevents,如果它没有捕捉到错误。

        2
  •  1
  •   Christopher Chase    14 年前

    您是否尝试在窗体上放置了at-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?

    推荐文章