• 0
Kitty

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

Вопрос

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

3 ответа на этот вопрос

  • 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
Rusland понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Makhammadjon
      Доброго времени суток! У меня вопрос, если можно объясните пожалуйста: я пишу программу с помощью С++ builder Seattle 10 (версия) для андроид платформы, но возникает проблема с загрузкой AUDIO файлов, в *.apk файл не грузится аудиофайлы. Невозможно изменить playaudiofile коды в sample. Объясните как можно  чтобы аудиофайлы грузились в андроид платформы. Спасибо за ответ!
    • Автор: Rusland
      Как узнать что MediaPlayer закончил воспроизведение аудио/видео файла?
      С 2015 года что-нибудь изменилось?
    • Автор: Steepe_Hare
      Здравствуйте!
      Стоит задача проиграть мелодию из ресурса (на андроиде). На просторах Инета нашел такое решение http://codeverge.com/embarcadero.delphi.firemonkey/tmediaplayer-and-resource-files/1059748
      Надо создать класс от TMedia и реализовать там методы (а также класс, производный от TCustomMediaCodec, но до этого я еще не дошел).
      Я споткнулся на реализации:
      type
        TMyResourceMedia = class(TMedia)
        private
          FPlayer: JMediaPlayer;
      JMediaPlayer сидит в модуле Androidapi.JNI.Media.pas, но Delphi его не находит. Надо ли указывать в настройках путь до "C:\Program Files\Embarcadero\Studio\18.0\source\rtl\android\Androidapi.JNI.Media.pas" или до "C:\Program Files\Embarcadero\Studio\18.0\lib\android\release\Androidapi.JNI.Media.dcu" ?
      Что-то боязно за генофонд Delphi
    • Автор: DANILICH DH
      Видео воспроизводится как на скриншоте, а надо чтобы было на всю форму. Как это сделать?

    • Автор: Вячеслав
      Добрый день, господа! Стоит следующая задача: отловить событие клика на MediaPlayerControl, растянутым на весь экран, чтобы в дальнейшем показать менюшку с паузой, перемоткой и т.д.
      Вроде задача простая, на я запнулся на том, что у MediaPlayerControl нет события OnClick и подобных, а только события для работы с жестами. 
      Пытался поверх MediaPlayerControl положить TRectangle, но при проигрывании видео MediaPlayerControl сразу же его перекрывает. Никакие BringToFront/SendToBack не помогают. Кто-нибудь сталкивался с подобным?
    • Автор: Alexey
      В VCL загрузку браузера можно остановить так: 
      webbrowser1.stop А как это сделать в firemonkey? 
    • Автор: c_breaker
      Добрый день!
       
      Пытаюсь побороть странную проблему.
       
      Есть задеплоеный звук формата mp3.
       
      Есть кнопка, по которой этот звук проигрывается при помощи лежащего на форме медиаплеера.
      mp.FileName := System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetPublicPath, 'beep.mp3'); mp.Play; все гениальное просто, и сколько бы я не нажимал на кнопку - звук проигрывается как в эмуляторе, так и на устройстве.
       
      Далее. Есть класс, скажем так - банк медиаплееров. Он создает их динамически:
      procedure TSoundBank.AddSound(SoundType: TSoundTypes; FileName: String); var mp: TMediaPlayer; i: integer; begin for i := 0 to FSounds.Count-1 do if FSounds[i].Tag = ord(SoundType) then raise Exception.Create('Sound of type TSoundTypes('+IntToStr(Ord(SoundType))+') already added!'); mp := TMediaPlayer.Create(FOwner); // эту и следующую строку я добавил уже потом, попробовав привязать компонент к форме mp.Parent := FOwner; FSounds.Add(mp); mp.FileName := FileName; if mp.Media = nil then raise Exception.Create('Filе format for the file '+FileName+' doesn''t supported!'); mp.Tag := Ord(SoundType); end; И метод, проигрывающий нужный звук.
      procedure TSoundBank.PlaySound(SoundType: TSoundTypes); var mp: TMediaPlayer; i: integer; begin mp := nil; for i := 0 to FSounds.Count-1 do if FSounds[i].Tag = Ord(SoundType) then mp := FSounds[i]; if mp = nil then raise Exception.Create('Cannot find sound of such type : TSoundTypes('+ IntToStr(Ord(SoundType)) + ')'); if mp.CurrentTime <> mp.Duration then mp.Stop; mp.CurrentTime := 0; mp.Volume := 1; //добавил позже на всякий случай mp.Play; end; Вот этот метод ничего не воспроизводит ни на устройстве, не на виртуалке. Причем нигде не падает, FMedia у MediaPlayer'а заполнен. Отладчик нормально проходит.
      Надо отметить, что все прекрасно работает если сбилдить под винду.
       
      Пробовал динамически создавать родной Android медиаплеер - он нормально работает на устройстве, но почему-то падает на виртуалке. но это уже другой вопрос)
       
      Помогите разобраться в тонкостях динамического создания медиплеера, уж очень хочется пользоваться возможностью написать один код под все приложения.
       
    • Автор: brunnengi
      Здравствуйте.
       
      Есть видео файл. При использование на форме mediaPlayerControl'а он воспроизводит видео поверх всего.
      Т.е. если взять TabContol и создать в нём две вкладки - TabItem1 и TabItem2 и в TabItem2 поместить MediPlayerControl с играющим видео, то даже если мы в процессе переключимся на на вкладку TabItem1, видео все равно будет видно.
      Сам видеоряд состоит из 150 кадров. Размер 600ш на 840в.
      Т.е. я могу конечно раскадрировать файл. 
      Но что мне потом использовать для адекватного отображения на форме?
      Я так понимаю что даже BitmapListAnimation мне тут не помощник, ибо, насколько я помню, у него есть свои ограничения на размеры.
      Так что мне тогда использовать?
    • Автор: Dozent
      Здравствуйте!
       
      RoverPad 3w7, Android 4.0.3
       
      Запускаю видео, звук есть, картинки нет...
      воспроизвожу так
      procedure TForm1.Button2Click(Sender: TObject); var s: string; begin // s := '/sdcard/publicity/1.mp3'; s := '/sdcard/publicity/video_8.mp4'; if FileExists(s) then begin ListView1.Items.Add.Text := s; MediaPlayer1.FileName := s; // '/sdcard/publicity/video_8.mp4'; MediaPlayer1.Play; end else ListView1.Items.Add.Text := 'File not Found'; end; Эта проблема как-то решается? И с чем это связано?
      Думал проблема в кодеках... Установился VPlayer и VPlayer COdec Arm7. 
      Видео через другие плееры воспроизводятся...
      Но картинка так и не появилась...
       
      Прошу подскажите как с этим бороться? Спасибо
    • Автор: FeLDMARShaL
      Какаято странная получается история. Не могу стабильно заставить работать приложение для Android при использовании TMediaPlayer.
      Создаю простое приложени: на форму кидаю Tmediaplayer, TTimer, в само андроид устройство заливаю два небольших mp4 файлика (по отдельности проверил mediaplayer их нормально воспроизводит). Задача така поочереди их воспроизводить. В теле таймера простенький код:
      1) Проверяем состоянеи плеера, если плер играет то выходим
      2) Если плеер закончил играть, посылаем команду стоп, затем команду clear, изменяем filename на другое, пытаемся запустить 2 видео и ... бац ошибка.
       
      В xe6 такой код работал на ура, в хе7 ерунда какаято.
       
      П.С. еще бажина: создаем 3 медиаплеера, каждому задаем пути до разных файлов, и после компиляции сразу бабац ошибка.
       
      может у меня карма плохая, может ктонибуть написать приложение самое наипростешеей которое позволяло бы прокручивать хотябы 2 медиа файла поочереди.
       
      П.С. у когонибуть есть удачный опыт подключения нативного videoview (например из вот этих компонентов D.P.F Delphi Android Native Components). Потомучто цель программы прокручивать без остановки видео, программа пишется за 2 минуты но из за косяков я прям даже не заню что делать. Приму любые дельные советы по поводу проигрывания видео на android.
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу