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

Не воспроизводится видео


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. 

Видео через другие плееры воспроизводятся...

Но картинка так и не появилась...

 

Прошу подскажите как с этим бороться? Спасибо

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

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

  • 0

TMediaPlayer идущий в стандартной поставке FMX не подходит для воспроизведения видео на разных устройствах. Пока разработчики вплотную не возьмутся за этот компонент решения с использованием этого компонента нет.

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

Я так понимаю вы нашли для себя решения через MX плеер? Что - то мне не хочется зависить от старонего приложения, мб вы нашли решение через стандартные приложения? Ведь в андройде вроде есть какойто стандартный плеер?

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

Я так понимаю вы нашли для себя решения через MX плеер?

На сегодняшний день, я как пользователь С++ Builder, вынуждена зависит от МХ плеера. Он реально решает все задачи. Стандартный плеер не годится.

Есть компонент от сторонних производителей: http://fire-monkey.ru/topic/809-android-native-player-for-delphicbuilder-component/#entry3396

он не работает в С++ Builder, поэтому в нынешней редакции он меня не интересует.

Пока со всеми задачами справляется МХ плеер.

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

не понятный компонент, после установки вылезло куча ошибок, бороться с ними времени нет, не советую, хотя если комуто интересно или кто то победит отпишите плз)

Переписка с техподом:

1:Hello. Install the trial version of the component "Android Native Player For Delphi & C ++ Builder Component 1.10". I can not understand how to use it? Delphi XE7. Where can I find a demo of using component?

2:Open the example D3Player.dproj under Trial version install

root\Examples\XE7 folder. Then run it , and make sure you have put
some video on your phone rom such as /sdcard/Movies/test.mp4, then
input the file name in the edit and click the play button to play it.

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

Переделал код из темы

http://fire-monkey.ru/topic/330-tmediaplayer-ne-zapuskaet-video-v-nekotorykh-versiiakh-andro/page-2

uses
ActivityManager, Androidapi.JNI.JavaTypes, Androidapi.Helpers, Androidapi.JNI.Net,
  Androidapi.JNI.GraphicsContentViewText;


procedure TForm1.Button3Click(Sender: TObject);
var
  PackageName: Jstring;
  ActiveManager: JActivityManager;
  sFile, exe: string;
  Intent: JIntent;
  Data: Jnet_Uri;
begin
  try
    sFile := '/sdcard/publicity/video_8.mp4';
    // MX player: https://sites.google.com/site/mxvpen/api
    PackageName := StringToJString('com.mxtech.videoplayer.ad');
    ActiveManager := GetActivityManager();
    ActiveManager.killBackgroundProcesses(PackageName);
    exe := Tpath.GetExtension(sFile);
    ListView1.Items.Add.Text := 'exe:   ' + exe;
    Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
    Data := StrToJURI(sFile);
    ListView1.Items.Add.Text := 'data:   ' + JURIToStr(Data);
    Intent.setDataAndType(Data, StringToJString(PWideChar('video/') + exe));
    Intent.setPackage(PackageName);
    Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP and TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK and
      TJIntent.JavaClass.FLAG_ACTIVITY_NO_HISTORY);
    SharedActivity().startActivity(Intent);
  finally
  end;
end;

 

А как вы отслеживаете что файл закончился играться?

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

У меня задача воспроизводить видео файл по кругу без остановки (зацикленный показ рекламы). Поэтому я не отслеживают конец видео. В настройках мх плеера стоит воспроизводить видео без остановки по кругу. Я только по таймеру запускают нужный видео файл в нужное время, а конец видео в моей задаче отслеживать не надо.

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

в вашей задачи один большой видео файл? или несколько небольших? Если несколько небольших откуда вы узнаёте что нужно запустить следующий файл?

У меня несколько маленьких видео файлов. Расписание храниться в ini файле. Таймер раз в минуту анализирует расписание. Если наступило время запуска следующего файла, запускаю мх плеер с новым файлом. Но это уже не относится к теме. Думаю можно по разному реализовать логику.

[One]

time=12.00

name=pizza.avi

и т.д.

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

ну хоть и косвено но это относится к воспроизведению видео. Т.е. вы знаете в какое время нужно запустить файл? Или же вы запоминаете длительность текущего ролика относительно настроект в ini файле? И по истечении длительности текущего видео запускаете новое?

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

Мне не надо знать длительность ролика. У меня есть четкое расписание:

В 8.00 крутить ролик №1

В 12.00 крутить ролик №2

и т.д.

Значит с 8 до 12 будет крутиться зациклено ролик №1.

Таймер раз в минуту анализирует содержимое ini файл и запускает видео файл. Например, таймер заглянул в ini файл в 8.01, значит надо играть ролик №1, потом таймер заглянул в 8.02. Снова надо запустить ролик №1, но он уже играет следовательно ничего не делаем.

Когда таймер заглянет в ini файл в 12.01 он "увидит" что в это время надо играть ролик с другим именем, тогда убиваем мх плеер и запускаем его с новым файлом.

При старте программы я считываю ini файл в удобный С++ STL контейнер map.

std::map<String, std::vector<String> > IniContent;

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

Контйнер заполняется данными при старте программы. Таймер просматривает этот контейнер раз в минуту.

 

Если у вас есть четкое расписание, вы сами можете придумать как лучше его анализировать.

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

за описание лагоритма спасибо, а как с форматами файлов? у вас все видео файлы одного типа?

 

Формат видео файла любой из тех что поддерживает мх плеер: .3gp .avi .divx .f4v .flv .mkv .mp4 .mpeg .mov .vob .wmv .webm .xvid и прочие.

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

Я заметил немного неожиданно поведение. Запускаю 3 видео с интервалом 10 секунд, соответственно видео не успевает закончится, начинает играться следующее. Прикол в том что по окончанию проигрывания 3 начинает проигрываться 2 а затем 1 видео и только потом закрывается плеер. Можете проверить у вас такая же ситуация? Спасибо...

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

Вы уверены что он закрывается? Можно вас попросить собрать тестовый проект. Запустить видео какоенить больше минуты, и чтобы по таймеру после запуска видео секунд через 20 сработало

сработал ActiveManager.killBackgroundProcesses(PackageName);

и ни чего больше. Закроется ли видео? У меня не закрываеться, не отрабатывает эта строчка. Буду очень благодарен за тест...

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

Вы уверены что он закрывается?

Вы читаете мои сообщения? Зачем одно и тоже переспрашивать?

Я не знаю что происходит у вас, у меня все нормально отрабатывает в проекте на С++. Программа сутками крутить рекламные ролики на мониторе. Крутит строго по расписанию и строго нужный ролик. Предыдущий ролик успешно закрывается. Не забываем про флаги очистки после закрытия и открытия нового ролика.

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

Я внимательно читаю ваши сообщения и перевёл приведёный вами код на делфи, отличия в нём ни какого только синтаксис другой и  уменя не закрывается предидущий воспроизводимый ролик, значит что то не так, что пока понять не могу, поэтмоу прошу Вас провести такой тест. Разве вам не интересно?

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

разрешение стоит, я тут на форуме нашёл одну из ваших тем, где вы добавляете в ActivityManager код какото китайца, мб в этом проблема? 

Попробую сегодня, ещё раз попрошу, если вас не затруднит соберите тестовый проект запустите видео и убейте его гденить на половине по таймеру...

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

разрешение стоит, я тут на форуме нашёл одну из ваших тем, где вы добавляете в ActivityManager код какото китайца, мб в этом проблема? 

Я точно не заводил тем про ActivityManager, наверно перепутали с кем-то... Было бы у меня решение, я поделился бы обязательно, тут многие об этом знают, не зря же я блог создавал.

Выложите тестовый проект на Делфях (желательно XE7), я попробую у себя проверить/посмотреть.

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

Андрей, не это я не вам Абсолютно, а девушке у которой всё работает) А Вам вообще отдельное спасибо за ваш блог!!! Много там нужного и полезно, а с проблемой я справился!!!

Я по своей невнимательности забыл что вертикальная палка это операция или и почему-то влупил AND

Всё работает, простите меня за не внимательность....

procedure TForm1.Play(const sFileName: string);
var
  PackageName: Jstring;
  ActiveManager: JActivityManager;
  sFile, exe: string;
  Intent: JIntent;
  Data: Jnet_Uri;
begin
  try
    sFile := sFileName;
    // MX player: https://sites.google.com/site/mxvpen/api
    PackageName := StringToJString('com.mxtech.videoplayer.ad');
    ActiveManager := GetActivityManager();
    ActiveManager.killBackgroundProcesses(PackageName);
    //
    exe := System.IOUtils.TPath.GetExtension(sFile);
    Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
    Data := StrToJURI(sFile);
    Intent.setDataAndType(Data, StringToJString(PWideChar('video/') + exe));

    Intent.setPackage(PackageName);
    { Intent.putExtra(StringToJString('end_by'), StringToJString('user'));
      https://github.com/NineWorlds/serenity-android/issues/134
      http://stackoverflow.com/questions/22408413/how-to-stop-android-mx-player-on-back-pressed
    }

    Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP or TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK or
      TJIntent.JavaClass.FLAG_ACTIVITY_NO_HISTORY);
    SharedActivity().startActivity(Intent);
  finally
  end;
end;
Ссылка на комментарий
  • 0

У вас есть решение такой же проблемы как и у меня, но почему то вы не хотите поделится:)

Я поделилась готовым рабочим кодом. Этого вполне достаточно.

Поскольку вопрос c MX решен, осталось надеется, что стандартный компонент плеера, тоже со временем научится воспроизводить видео на всех устройствах, как это делает МХ плеер. Надеямся на помощь FMX разработчиков в усовершенствовании стандартного компонента плеера в следующем обновлении студии.

Также хотелось бы иметь в инспекторе свойство loop для стандартного компонента плеера, а не придумывать свой таймер для воспроизведения видео по кругу.

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

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

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

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

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

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

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

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

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

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