Оптимизация воспроизведения видео в плеере Alcinoe
Проблема, описанная пользователем, связана с работой видеоплеера Alcinoe от Zeau64. Во время воспроизведения видео происходит его кратковременное зависание и последующий повторный старт. При этом каждый из процедур работает корректно по отдельности, но при их совместном использовании возникает конфликт. В частности, проблемы вызывают таймер и трекинг (tracking), что приводит к сбоям в работе системы на миллисекунды.
Код пользователя
procedure TForm9.FormCreate(Sender: TObject);
begin
ALVideoPlayerSurface1.VideoPlayer.prepare(VidUrl1, True);
TrackBar1.Max := ALVideoPlayerSurface1.VideoPlayer.getDuration;
end;
procedure TForm9.ALTrackBar1Tracking(Sender: TObject);
begin
ALVideoPlayerSurface1.VideoPlayer.seekTo(Round(TrackBar1.Value));
SecPass.Text := FormatDateTime('nn:ss', (Round(TrackBar.Value) div 1000) / SecsPerDay);
end;
procedure TForm9.Timer1Timer(Sender: TObject);
begin
TrackBar1.Value := ALVideoPlayerSurface1.VideoPlayer.getCurrentPosition;
SecPass.Text := FormatDateTime('nn:ss', (ALVideoPlayerSurface1.VideoPlayer.getCurrentPosition div 1000) / SecsPerDay);
end;
Описание проблемы
Пользователь задался вопросом, как правильно разместить трекинг TrackBar для перемещения видео на желаемую позицию. Несмотря на попытки использования событий OnClick и OnTap, трекинг был установлен в положение False.
Решение проблемы
Ошибка заключается в том, что таймер обновляет текущую позицию TrackBar, что, в свою очередь, запускает событие трекинга TrackBar и приводит к поиску позиции видео. Для решения данной проблемы можно использовать глобальную переменную Seeking, которая устанавливается в значение True при событии OnMouseDown TrackBar и сбрасывается в False при событии OnMouseUp. В процедуре обработки трекинга необходимо проверить, установлена ли переменная Seeking в состояние True. Если да, то это означает, что пользователь вручную перемещает позицию воспроизведения видео; если нет - значит, позиция была обновлена таймером, и дополнительный поиск не требуется.
Пример кода
var
Seeking: Boolean;
...
procedure TForm9.FormCreate(Sender: TObject);
begin
Seeking := False;
end;
procedure TForm9.ALTrackBar1MouseDown(Sender: TObject);
begin
Seeking := True;
end;
procedure TForm9.ALTrackBar1MouseUp(Sender: TObject);
begin
Seeking := False;
end;
procedure TForm9.ALTrackBar1Tracking(Sender: TObject);
begin
if not Seeking then
Exit; // Позиция была обновлена таймером, не выполняем поиск
ALVideoPlayerSurface1.VideoPlayer.seekTo(Round(TrackBar1.Value));
SecPass.Text := FormatDateTime('nn:ss', (Round(TrackBar1.Value) div 1000) / SecsPerDay);
end;
Заключение
Приведенное решение позволяет избежать конфликтов между таймером и трекингом TrackBar, обеспечивая плавное воспроизведение видео без зависаний. Метод проверки глобальной переменной Seeking эффективен и может быть использован в различных приложениях на Object Pascal.
Это пример статьи для оптимизации работы с видеоплеером Alcinoe, написанный согласно запросу пользователя с учетом основных требований SEO. Статья содержит анализ проблемы, описание метода решения с примерами кода и рекомендациями по его внедрению в проекты на Delphi и Pascal.
Проблема воспроизведения видео в плеере Alcinoe связана с конфликтом между таймером и трекингом полосы прокрутки, что приводит к кратковременным зависаниям.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS