From 05c02f7dc4047f6676ce044cf19a1ca2f2db9130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20D=E2=80=99Aquino?= Date: Wed, 8 Oct 2025 15:51:59 -0700 Subject: [PATCH] Initialize AVPlayerItem on the background to avoid hitches MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Daniel D’Aquino --- .../Shared/Media/Video/DamusVideoPlayer.swift | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/damus/Shared/Media/Video/DamusVideoPlayer.swift b/damus/Shared/Media/Video/DamusVideoPlayer.swift index b7da3986..31043adc 100644 --- a/damus/Shared/Media/Video/DamusVideoPlayer.swift +++ b/damus/Shared/Media/Video/DamusVideoPlayer.swift @@ -108,10 +108,23 @@ import SwiftUI public init(url: URL) { self.url = url - self.player = AVPlayer(playerItem: AVPlayerItem(url: url)) + // Initialize with an empty player first + self.player = AVPlayer() self.video_size = nil - Task { await self.load() } + // Creating the player item is an expensive action. Create it on a background thread to avoid performance issues. + Task.detached(priority: TaskPriority.userInitiated) { + self.loadPlayerItem(url: url) + } + } + + nonisolated private func loadPlayerItem(url: URL) { + let playerItem = AVPlayerItem(url: url) + + DispatchQueue.main.async { + self.player.replaceCurrentItem(with: playerItem) + Task { await self.load() } + } } func reinitializePlayer() { @@ -122,12 +135,12 @@ import SwiftUI videoDurationObserver?.invalidate() videoIsPlayingObserver?.invalidate() - // Reset player - self.player = AVPlayer(playerItem: AVPlayerItem(url: url)) + // Initialize player with nil item first + self.player.replaceCurrentItem(with: nil) - // Load once again - Task { - await load() + // Creating the player item is an expensive action. Create it on a background thread to avoid performance issues. + Task.detached(priority: TaskPriority.userInitiated) { + self.loadPlayerItem(url: self.url) } }