Refactor VlcVideoView for enhanced video playback performance and user interaction. Update README.md to clarify the new control's functionality, including frame handling and buffer management. Modify VideoPlayerView.axaml for improved layout and error message display. Enable unsafe code blocks in project settings to optimize frame copying process.
This commit is contained in:
@@ -78,20 +78,19 @@ dotnet test
|
||||
только по «Сохранить», так что отмена не оставляет следов. Пересканирование запускается
|
||||
только если изменилось то, что влияет на состав библиотеки, — смена темы или ширины кадра
|
||||
его не вызывает.
|
||||
- **Плеер — свой контрол `VlcVideoView` поверх LibVLCSharp.** Avalonia создаёт нативное
|
||||
дочернее окно, VLC рисует прямо в него: ни один кадр не проходит через управляемую память.
|
||||
Расплата — airspace: поверх видео ничего нарисовать нельзя, поэтому контролы и сообщения
|
||||
об ошибках живут рядом с картинкой, а не на ней. Транспорт (позиция, длительность,
|
||||
play/pause) — свойства самого контрола, поэтому им управляет code-behind страницы;
|
||||
дублировать это состояние во вьюмодель значило бы держать вторую копию и синхронизировать её.
|
||||
Закрытие страницы обнуляет `OpenedVideo`, вью уходит из дерева, `DestroyNativeControlCore`
|
||||
гасит плеер.
|
||||
По той же причине в полноэкранном режиме остаётся тонкая полоса управления внизу:
|
||||
всплывающего оверлея поверх видео нативная поверхность не допускает, а движение мыши над
|
||||
ней до Avalonia не доходит — автоскрытию не на что реагировать.
|
||||
Готовый `MediaPlayer.Controls` пробовали до этого: декодер работал, но кадры до экрана
|
||||
не доходили — чёрный экран и на GPU-, и на CPU-пути, при полностью рабочем в приложении
|
||||
`OpenGlControlBase`. Свой контрол ни от чьей версии Avalonia не зависит.
|
||||
- **Плеер — свой контрол `VlcVideoView` поверх LibVLCSharp.** VLC декодирует в память,
|
||||
которую мы ему выдаём, а рисуем кадр сами: видео остаётся обычным контролом Avalonia —
|
||||
участвует в hit-тесте, принимает жесты, поверх него можно класть что угодно. Цена — одно
|
||||
копирование на показанный кадр, и на 4K оно становится основной стоимостью воспроизведения.
|
||||
Буферов два: VLC декодирует в один, пока мы читаем другой; на `Display` они меняются
|
||||
местами под коротким локом. Транспорт (позиция, длительность, play/pause) — свойства самого
|
||||
контрола, поэтому им управляет code-behind страницы; дублировать это состояние во вьюмодель
|
||||
значило бы держать вторую копию и синхронизировать её. Закрытие страницы обнуляет
|
||||
`OpenedVideo`, вью уходит из дерева, и плеер гасится вместе с буферами.
|
||||
До этого пробовали два готовых пути. `MediaPlayer.Controls`: декодер работал, но кадры до
|
||||
экрана не доходили — чёрный экран и на GPU-, и на CPU-пути, при полностью рабочем в
|
||||
приложении `OpenGlControlBase`. Нативное окно VLC через `NativeControlHost`: картинка
|
||||
появилась, но окно поверх поверхности Avalonia не пропускает ни клик, ни оверлей.
|
||||
- **Кэш превью самовосстанавливается.** Диск — ключ `sha256(путь|размер|mtime)`, память — LRU
|
||||
на 256 декодированных битмапов. Сканирование проверяет, что запомненный кадр физически
|
||||
на месте (`IThumbnailGenerator.IsAvailable`), и перерисовывает удалённые; после полного
|
||||
|
||||
Reference in New Issue
Block a user