Перейти к содержанию
  • Регистрация
  • 0
Maka

Воспроизведение без задержки

Вопрос

Столкнулся с небольшой проблемой

Воспроизвожу звук стандартным Media Player'ом вот так:

var 
  MediaPlayerOK: TMediaPlayer;

procedure Play_SoundOK;
begin  
  if not Assigned(MediaPlayerOK) then begin
    MediaPlayerOK := TMediaPlayer.Create(nil);    
    MediaPlayerOK.FileName := System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetDocumentsPath, 'ok-3.3gp');
  end;
  MediaPlayerOK.CurrentTime := 0;
  MediaPlayerOK.Play;
end;

Воспроизведение запускается с ощутимой задержкой (сотни мс). Если файл длинный и воспроизводится 1 раз - то это незаметно, но если это, например, звук, воспроизводящийся при нажатии какой-то объект, и это происходит часто, то это очень бросается в глаза.

Как коллеги решают подобную проблему?

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


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

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

  • 0
16 минут назад, Maka сказал:

Столкнулся с небольшой проблемой

Воспроизвожу звук стандартным Media Player'ом вот так:


var 
  MediaPlayerOK: TMediaPlayer;

procedure Play_SoundOK;
begin  
  if not Assigned(MediaPlayerOK) then begin
    MediaPlayerOK := TMediaPlayer.Create(nil);    
    MediaPlayerOK.FileName := System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetDocumentsPath, 'ok-3.3gp');
  end;
  MediaPlayerOK.CurrentTime := 0;
  MediaPlayerOK.Play;
end;

Воспроизведение запускается с ощутимой задержкой (сотни мс). Если файл длинный и воспроизводится 1 раз - то это незаметно, но если это, например, звук, воспроизводящийся при нажатии какой-то объект, и это происходит часто, то это очень бросается в глаза.

Как коллеги решают подобную проблему?

Для начала избавьтесь от создания TMediaPlayer. Правда по приведенному коду неясно создается он каждый раз или используется первый созданный экземпляр. MediaPlayerOK и procedure Play_SoundOK потомки какой то одной формы?

Ну и проигрывать звук лучше более простыми методами, хотя в большинстве они платформо-зависимы (к примеру sndPlaySound из Winapi.MMSystem.pas).

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


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

Для начала избавьтесь от создания TMediaPlayer. Правда по приведенному коду неясно создается он каждый раз или используется первый созданный экземпляр. MediaPlayerOK и procedure Play_SoundOK потомки какой то одной формы?

MediaPlayerOK создается только при первом вызове.

Цитата

Ну и проигрывать звук лучше более простыми методами

да, забыл добавить, что речь об Android.

А не подскажете как раз под Android более простой метод?

Изменено пользователем Maka

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, wamaco сказал:

Попробуйте обернуть в Task

Спасибо, однако даже в теории не могу понять как это может помочь. Насколько я понимаю, причина лежит в тяжеловесности компонента TMediaPlayer и в том, что перед воспроизведением он выполняет некую долгую инициализацию.

А то что мы эту инициализацию делегируем в отдельный поток, ее никак не уменьшает.

И тем не менее, попробовал. Ожидаемо без положительного эффекта.

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

Изменено пользователем Maka

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
var Player: JMediaPlayer;

Единожды создаете плеер и готовите файл:

Player:=TJMediaPlayer.Create;
Player.setDataSource(StringToJString('Путь_к_файлу'));
Player.prepare; 

И, когда потребуется, запускаете воспроизведение

Player.start;

В uses нужно добавить что-то из этого:

FMX.Helpers.Android, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, 
  Androidapi.JNI.Media, Androidapi.JNI.JavaTypes, Androidapi.JNI.AdMob, 
  Androidapi.JNI.App, Androidapi.JNIBridge, FMX.Advertising, FMX.Platform.Android,
  Androidapi.JNI.Embarcadero

Не помню уже, что именно. Ненужные уберите

Изменено пользователем Alex7wrt

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, Maka сказал:

MediaPlayerOK создается только при первом вызове.

да, забыл добавить, что речь об Android.

А не подскажете как раз под Android более простой метод?

Ну вряд ли найдется  метод "более простой", я имел ввиду методы конкретной платформы, к примеру для андроида JAudioTrack или JAudioManager. Посмотрите вот тут http://www.fmxexpress.com/free-game-audio-manager-wrapper-class-in-delphi-xe6-firemonkey-for-android-ios-windows-and-osx/ может вам подойдет, или поищите (даже на этом форуме) JAudioTrack

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


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

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

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

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

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

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

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

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

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


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

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

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