Delphi: EMCIDeviceError при запуске MCI - PullRequest
4 голосов
/ 14 марта 2010

Я использую компонент TMediaPlayer для воспроизведения музыки.

Отлично работает с большинством моих треков. Но это не работает с некоторыми треками. Когда я хочу их воспроизвести, отображается следующее сообщение об ошибке:

alt text

Это немецкий, но примерно означает, что:

В проекте pMusicPlayer.exe произошло исключение класса EMCIDeviceError. Сообщение: «Ошибка при запуске MCI.». Процесс был остановлен. Продолжите с «Отдельная команда / инструкция» или «Старт».

Программа завершает работу сразу после вызова процедуры «Воспроизведение» TMediaPlayer.

Эта ошибка произошла со следующим файлом, например:

  • размер файла: 7,40 МБ
  • продолжительность: 4:02 минуты
  • битрейт: 256 кбит / с

Я закодировал этот файл с битрейтом 128 кбит / с и, следовательно, с размером файла 3,70 МБ: он отлично работает!

Что не так с первым файлом? Проигрыватель Windows Media или другие программы могут воспроизводить его без проблем.

Возможно ли, что Delphi TMediaPlayer не может обрабатывать большие файлы (например,> 5 МБ) или файлы с высокой скоростью передачи битов (например,> 128 кбит / с)?

Что я могу сделать, чтобы решить проблему?

Дополнительный вопрос: Почему я не могу использовать попробовать / кроме, чтобы предотвратить окно сообщения?

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

Это не работает.

Ответы [ 2 ]

2 голосов
/ 16 марта 2010

ОК. Я выяснил источник проблемы. Я использовал это маленькое Delphi MP3 Player Tutorial (вы можете загрузить проект там ), чтобы проверить ваш файл MP3, и я получил ту же ошибку, что и вы с вашим MP3.

После некоторых тестов я обнаружил, что другие файлы MP3 хорошо воспроизводятся в этом учебном приложении. Ваш MP3 хорошо работал с Windows Media Player и другими мультимедийными плеерами.

Да, перекодировка файла решит проблему, но это не настоящая проблема. Проблема заключается в метаданных MP3 (теги ID3), а не в самой кодировке звука.

Я использовал Mp3tag только , только удалял теги в файле, и все воспроизводилось хорошо после этого, без EMCIDeviceError.

Похоже, что TMediaPlayer может аварийно завершить работу с некоторым форматом метаданных. Во время поиска я также видел отчеты об ошибках TMediaPlayer с файлами MP3, которые также содержали обложку JPEG.

Большинство людей, которые отвечали на сообщения об ошибках в TMediaPlayer на форумах, которые я смотрел, говорили, что TMediaPlayer действительно устарел и вообще плох (я думаю, что он не обновлялся в течение 10 лет). Если вам нужна мощная поддержка MP3 в вашем приложении, рассмотрите возможность использования другого компонента . Вы также можете использовать Windows Media Player ActiveX в своем приложении Delphi.

Для вашего дополнительного вопроса о попробуйте / кроме попробуйте что-то вроде:

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

Или рассмотрите возможность использования TApplicationEvents, если она не перехватывает ошибку.

1 голос
/ 17 марта 2010

Вы пытались поместить в форму управления 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;

Я перекодировал mp3, используя winlame , и это работает. Что вы используете для кодирования mp3-файлов?

...