Перейти к содержанию
Fire Monkey от А до Я
  • 0

[Android] При задании нового видео-файла TMediaPlayer у меня вываливается из памяти программа. В чем может быть причина?


Kitty

Вопрос

Я использую TMediaPlayer для воспроизведения видео по кругу и плюс в таймере необходим запуск разных видео файлов по расписанию. Выяснилось следующее -

если использовать для запуска нового файла такой код, то периодически программа вываливается из памяти:

//в таймере запуск видео с другим именем
MediaPlayer1->Stop();
MediaPlayer1->FileName = name; //другой файл
MediaPlayer1->Play();

А если запускать новый файл в TMediaPlayer так, то вроде работает и программа не вываливается:

//в таймере запуск видео с другим именем
MediaPlayer1->Stop();
MediaPlayer1->Clear();//вроде помогло, но надежно ли?
MediaPlayer1->FileName = name;
MediaPlayer1->Play();

Достаточно ли строки MediaPlayer1->Clear(); чтобы предотвратить возможное вываливание программы из памяти в будущем?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Администраторы

С какой ошибкой вываливается из памяти? Ошибку можно посмотреть в LogCat

 

Вызов MediaPlayer1.Clear не особо должен чем-то помочь:

procedure TMediaPlayer.Clear;
begin
  FreeAndNil(FMedia);
  FFileName := '';
end;

Он просто удаляет связанный объект TMedia с вашим файлом. А задание нового имени файла, как вы можете заметить, тоже чистит объект TMedia:

procedure TMediaPlayer.SetFileName(const Value: string);
begin
  if csDesigning in ComponentState then
  begin
    if FFileName <> Value then
      FFileName := Value;
  end
  else
  begin
    // We shall recreate media object as the file content could change.
    // For example if we make recording in the same file
    if Assigned(FMedia) then
    begin
      FMedia.DisposeOf; // <--- Очистка объекта TMedia
      FMedia := nil; // <--- Уменьшение счетчика ссылок
    end;
    FFileName := Value;
    if FileExists(FFileName) then
    begin
      FMedia := TMediaCodecManager.CreateFromFile(FFileName);
      if Assigned(FMedia) then
        FMedia.Control := FControl;
    end
    else
      raise ECaptureDeviceException.Create(SFileNotFound);
  end;
end;

Итог: Нужно узнать почему программа вывалилась из памяти.

Ссылка на комментарий
  • 0

Столкнулся с такой же проблемой.
Использую «RAD Studio 10 Seattle».
Каждый раз, когда у TMediaPlayer задаешь новый FileName, идёт утечка памяти – это баг Firemonkey.

Скорее всего, ошибка находится в файле «FMX.Media.pas».
Как исправить эту ошибку? Что и как исправлять в файле «FMX.Media.pas»?
 

Цитата

https://quality.embarcadero.com/browse/RSP-12953
TMediaPlayer's (FileName) function causes a major memory leak

Type: Bug
Status: Open
Priority: Major
Resolution: Unresolved
Affects Version/s: 10 Seattle
Fix Version/s: None
Component/s: FireMonkey

Description
Whenever you add the file (MediaPlayer1.FileName) the Clear command will not remove it from memory, the program will become unstable because of the large memory leaks and crash after adding multiple files.
How to clear the file after loading it in the MediaPlayer1?

1 - Create new FireMonkey project
2 - add two buttons
Button 1 : MediaPlayer1.FileName:= 'E:\Buddha_Bar.mp3';  Large File
Button 2 : MediaPlayer1.Clear;

Thank you
ray

Проверил на «RAD Studio 10.2 Tokyo» - проблема утечки памяти тоже присутствует.

Просто в цикле задаешь новый (или даже тот же самый) TMediaPlayer.FileName, и каждый раз идёт утечка памяти, и очень скоро программа падает из-за недостатка памяти.
Функция TMediaPlayer.Clear не помогает, ибо память не освобождается.
Из-за этого бага TMediaPlayer является неработоспособным и TMediaPlayer просто невозможно использовать в реальных проектах.
Как решить эту проблему?

Изменено пользователем mantas
Ссылка на комментарий
  • 0
1 минуту назад, FREEFAR сказал:

А если сам плеер уничтожать и пересоздавать - все равно беда?

По началу MediaPlayer был на форме, которая создавалась динамически. Но там глюки были и на нормальных машинах, поэтому от такой реализации пришлось отказать. Как временный выход - перенес его в датамодуль и использовать только один экземпляр MediaPlayer, плюс доработки напильником при закрытии формы нужно было делать. В конце концом более менее приемлемый вариант получился. На машине с 3 гб Ram нормально. Где 1 гб - пару раз открытий видео и вылет (хотя это конечно и от версии андроида зависить или еще от чего-то).

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...