7

私は音楽を再生するためにTMediaPlayerコンポーネントを使用しています。

ほとんどのトラックで問題なく動作します。ただし、一部のトラックでは機能しません。それらを再生したい場合、次のエラーメッセージが表示されます。

代替テキスト

これはドイツ語ですが、大まかに言うと次のことを意味します。

プロジェクトpMusicPlayer.exeで、クラスEMCIDeviceErrorの例外が発生しました。メッセージ:「MCIの起動時にエラーが発生しました。」プロセスが停止しました。「単一コマンド/ステートメント」または「開始」に進みます。

プログラムは、TMediaPlayerのプロシージャ「Play」を呼び出した直後に終了します。

このエラーは、たとえば次のファイルで発生しました。

  • ファイルサイズ:7.40 MB
  • 所要時間:4:02分
  • ビットレート:256 kBit / s

このファイルを128kBit/ sのビットレートでエンコードしたため、ファイルサイズは3.70MBです。正常に動作します。

最初のファイルの何が問題になっていますか?WindowsMediaPlayerなどのプログラムで問題なく再生できます。

DelphiのTMediaPlayerが大きなファイル(例:> 5 MB)または高ビットレートのファイル(例:> 128 kBit / s)を処理​​できない可能性はありますか?

問題を解決するために何ができますか?

追加の質問: メッセージウィンドウを防ぐためにtry /exceptを使用できないのはなぜですか?

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

これは機能しません。

4

2 に答える 2

2

OK問題の原因を突き止めました。この小さなDelphiMP3プレーヤーチュートリアルプロジェクトをダウンロードできます)を使用してMP3ファイルをテストしましたが、MP3と同じエラーが発生しました。

いくつかのテストの後、他のMP3ファイルがそのチュートリアルアプリケーションでうまく機能することがわかりました。MP3は、WindowsMediaPlayerやその他のマルチメディアプレーヤーでうまく機能しました。

はい、ファイルを再エンコードすると問題は解決しますが、それは本当の問題ではありません。問題は、サウンドエンコーディング自体ではなく、MP3のメタデータ(ID3タグ)に起因します。

Mp3tagを使用してファイルのタグのみを削除しましたが、その後はすべて正常に再生され、EMCIDeviceErrorは発生しませんでした。

TMediaPlayerは、ある形式のメタデータでクラッシュする可能性があるようです。また、検索中にJPEGカバーアートを埋め込んだMP3ファイルを含むTMediaPlayerのバグレポートも見ました。

私が見たフォーラムでTMediaPlayerに関するバグに答えていたほとんどの人は、TMediaPlayerは本当に時代遅れで、一般的に悪いと言っていました(10年ほど更新されていないと思います)。アプリケーションで強力なMP3サポートが必要な場合は、別のコンポーネントの使用を検討してください。DelphiアプリケーションでもWindowsMediaPlayerActiveXを使用できます。

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;

例外は、PlayではなくOpenで発生します。したがって、コードを変更して、openプロシージャで例外をトラップできる場合。

  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 に答える