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

Как записать видео на Андроиде?


megajack991

Вопрос

Добрый день!

 

Как в FM сделать фото известно, как записать звук тоже известно, а как записать видео с камеры?

3 дня уже ковыряю и исходники и интернеты- по нулям..

Причем странно то, что при использовании TTakePhotoFromCameraAction открывается "стандартный" интерфейс камеры, в нем есть кнопка переключения режима на видеосъемку, но кнопка задизаблена. Как бы вот "стандартными" средствами записать видео..

 

Заранее благодарю.

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

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

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

Добрый день,

 

Да, действительно TTakePhotoFromCameraAction используем стандартный нативный интерфейс получении фотографий и съемки видео. Но в нем нет поддержки видео по той причине, что йос не дает прямого доступа к самому видео файлу и скрывает его за публичной оболочкой. Это значит, что записанное таким способом видео, можно просматривать и воспроизводить в штатном проигрывателе мобильного устройства, но при этом вам не получить прямой доступ к самому содержимого. Поэтому остается вариант использовать для записи видео компонент FireMonkey TCameraComponent. Этот компонент не позволяет в прямую сохранить видео, но он выдает поток кадров, с которыми вы можете работать на уровне TBitmap и записать их в том числе в видео файл.

 

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

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

Собирать видео из кадров вполне реально - так делают и делют программы по записи видео - кодеки клят кадры. Поэтому они жрут ресурсы.

Проблема другая  - TCameraComponent выдает 2-3 FPS и как получить больше не понятно...

TVideoCaptureDevice дает те же самые 2-3 FPS...

В итоге как получить родные 30 кадров в секунду не понятно.

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

Вообще, конечно, собрать видео из отдельных кадров можно. Вполне реально. Но не для всего)

И это все "свистоперделки"...

Что касается частоты кадров - реально получать 10-15. Еще и от устройства зависит, от камеры и т.д. Но все эти тормоза из-за класса "обертки" работы с видео. Именно он выдает так мало кадров. Сама камера работает. FMX работает тоже ничего, но основные тормоза из-за того что в TCameraComponent уже "приходит" мало кадров.

На самом деле, как я считаю, разработка для мобильных платформ должна в первую очередь решать именно мультимедийные функции (я бы сказал, что это ОЧЕНЬ важно). А мы имеем пока-что их жалкое подобие, которое нужно допиливать ручками...

Я уже не говорю о том, что почему-то если в той же iOS что-то "запрещено", то это же касается и Android, хотя в ней все намного проще и она более "открыта". Глупо как-то, уж простите за откровенность...

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

Вообще, конечно, собрать видео из отдельных кадров можно. Вполне реально. Но не для всего)

И это все "свистоперделки"...

Что касается частоты кадров - реально получать 10-15. Еще и от устройства зависит, от камеры и т.д. Но все эти тормоза из-за класса "обертки" работы с видео. Именно он выдает так мало кадров. Сама камера работает. FMX работает тоже ничего, но основные тормоза из-за того что в TCameraComponent уже "приходит" мало кадров.

На самом деле, как я считаю, разработка для мобильных платформ должна в первую очередь решать именно мультимедийные функции (я бы сказал, что это ОЧЕНЬ важно). А мы имеем пока-что их жалкое подобие, которое нужно допиливать ручками...

Я уже не говорю о том, что почему-то если в той же iOS что-то "запрещено", то это же касается и Android, хотя в ней все намного проще и она более "открыта". Глупо как-то, уж простите за откровенность...

Да чего там )) Все точно подмечено. Напишу немного не в тему, тоже извините... Я вот удивляюсь, почему относительно несложные приложения на андроиде после установки на устройство занимают около 30 МБ, когда нативные могут и меньше мегабайта весить. Неоспоримый плюс FMX - возможность практически одним кодом писать для нескольких платформ, из-за чего страдает качество в каждом из них. Здесь однозначно есть к чему стремиться.

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

Вот нашел код для записи видео (проверил - работает):

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  Androidapi.JNI.GraphicsContentViewText,
  System.Messaging,  // TMessageManager
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation;

type
  TForm1 = class(TForm)
    BtnRecord: TButton;
    Label1: TLabel;
    procedure BtnRecordClick(Sender: TObject);
  private
    { Private declarations }
    procedure HandleActivityMessage(const Sender: TObject; const M: TMessage);
    function  OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean;
  public
    { Public declarations }
   FMessageSubscriptionID:integer;
  end;

var
  Form1: TForm1;

const
  RECORD_VIDEO = 9;

implementation

{$R *.fmx}

uses
  System.IOUtils,
  Androidapi.JNI.Provider,
  Androidapi.JNI.App,
  Androidapi.JNI.Net,
  Androidapi.JNIBridge,
  Androidapi.Helpers,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Os;



procedure TForm1.BtnRecordClick(Sender: TObject);
var
  VideoIntent: JIntent;
  videoUri: Jnet_Uri;
  AFile: JFile;
  FileName: TFileName;
begin
  FMessageSubscriptionID :=
    TMessageManager.DefaultManager.SubscribeToMessage(
      TMessageResultNotification, HandleActivityMessage);
  VideoIntent :=
    TJIntent.JavaClass.init(
      TJMediaStore.JavaClass.ACTION_VIDEO_CAPTURE
    );
  if (
    VideoIntent.resolveActivity(
      SharedActivityContext.getPackageManager()
    ) <> nil) then
  begin
    FileName := TPath.Combine(
      TPath.GetSharedDocumentsPath, 'recording.mp4'); // см. /storage/sdcard0/Documents
    AFile:=TJFile.JavaClass.init(
      StringToJString(FileName));
    videoUri:=TJnet_Uri.JavaClass.fromFile(AFile);
    VideoIntent.putExtra(
      TJMediaStore.JavaClass.EXTRA_OUTPUT,
      TJParcelable.Wrap((videoUri as ILocalObject).GetObjectID));
    SharedActivity.startActivityForResult(VideoIntent, RECORD_VIDEO);
  end;
end;


procedure TForm1.HandleActivityMessage(const Sender: TObject;
  const M: TMessage);
begin
  if M is TMessageResultNotification then
    OnActivityResult(
      TMessageResultNotification(M).RequestCode,
      TMessageResultNotification(M).ResultCode,
      TMessageResultNotification(M).Value);
end;


function TForm1.OnActivityResult(RequestCode, ResultCode: Integer;
  Data: JIntent): Boolean;
begin
  Result := False;

  TMessageManager.DefaultManager.Unsubscribe(
    TMessageResultNotification, FMessageSubscriptionID);
  FMessageSubscriptionID := 0;

  if RequestCode = RECORD_VIDEO then
  begin
    if ResultCode = TJActivity.JavaClass.RESULT_OK then
    begin
      TThread.Queue(nil, procedure
      begin
        Label1.Text:='recording completed';
        Invalidate;
      end);
    end;
  end;
end;

end.

Пишет стандартной программой и сохраняет под названием recording.mp4

Если нужно просто писать видео, то подойдет. 

Ссылка на комментарий
  • 0
В 05.09.2015 в 18:18, Alex7wrt сказал:

нативные могут и меньше мегабайта весить.

они как раз не нативные. просто 700 мб всякой явы уже установлено в систему

а делфи с собой все тянет.

и QT и Xamarin делают все точно так же

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

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...