• 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 раз - то это незаметно, но если это, например, звук, воспроизводящийся при нажатии какой-то объект, и это происходит часто, то это очень бросается в глаза.

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

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


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

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

  • 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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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