diff --git a/tvbox/Models/PlayerEngine.swift b/tvbox/Models/PlayerEngine.swift index 1d3d85a..df9adc8 100644 --- a/tvbox/Models/PlayerEngine.swift +++ b/tvbox/Models/PlayerEngine.swift @@ -122,12 +122,12 @@ enum VLCBufferMode: Int, CaseIterable, Identifiable { if isLive { return (network: 2600, live: 2600, file: 3200) } - return (network: 3800, live: 3200, file: 4400) + return (network: 6000, live: 5000, file: 6400) case .smooth: if isLive { return (network: 4200, live: 4200, file: 5200) } - return (network: 5600, live: 4800, file: 6400) + return (network: 8000, live: 6800, file: 8400) } } } diff --git a/tvbox/Views/Detail/DetailView.swift b/tvbox/Views/Detail/DetailView.swift index c99d482..ac618a5 100644 --- a/tvbox/Views/Detail/DetailView.swift +++ b/tvbox/Views/Detail/DetailView.swift @@ -19,7 +19,7 @@ struct DetailView: View { ScrollView { VStack(spacing: 0) { // 播放器区域 - if viewModel.isPlaying, let url = viewModel.playUrl, !showFullScreen { + if viewModel.isPlaying, let url = viewModel.playUrl { PlayerView( urlString: url, startPosition: viewModel.currentPlaybackSeconds(), @@ -38,6 +38,8 @@ struct DetailView: View { .onTapGesture(count: 2) { openFullScreenPlayer() } + .opacity(showFullScreen ? 0 : 1) + .allowsHitTesting(!showFullScreen) } // 视频信息 diff --git a/tvbox/Views/Player/VLCPlayerView.swift b/tvbox/Views/Player/VLCPlayerView.swift index 09c3d23..f141026 100644 --- a/tvbox/Views/Player/VLCPlayerView.swift +++ b/tvbox/Views/Player/VLCPlayerView.swift @@ -169,7 +169,7 @@ final class VLCPlayerController: NSObject, ObservableObject, VLCMediaPlayerDeleg cacheConfig.live += vodCacheBoostExtraLive cacheConfig.file += vodCacheBoostExtraFile } - let enableFrameDrop = isLive ? bufferMode.enableFrameDrop : true + let enableFrameDrop = isLive ? bufferMode.enableFrameDrop : false let enableSkipFrames = isLive && bufferMode.enableFrameDrop var mediaOptions: [String: Any] = [ "network-caching": cacheConfig.network, @@ -179,6 +179,10 @@ final class VLCPlayerController: NSObject, ObservableObject, VLCMediaPlayerDeleg "skip-frames": enableSkipFrames ? 1 : 0, "http-reconnect": 1 ] + if !isLive { + mediaOptions["avcodec-hurry-up"] = 0 + mediaOptions["clock-jitter"] = 5000000 + } if let hwOption = decodeMode.vlcHardwareDecodeOption { mediaOptions["avcodec-hw"] = hwOption @@ -580,11 +584,14 @@ final class VLCPlayerController: NSObject, ObservableObject, VLCMediaPlayerDeleg } private func applyPlaybackRate() { + guard mediaPlayer.rate != playbackRate else { return } mediaPlayer.rate = playbackRate } private func applyVolume() { - mediaPlayer.audio?.volume = Int32(volume) + let target = Int32(volume) + guard mediaPlayer.audio?.volume != target else { return } + mediaPlayer.audio?.volume = target } private func syncDecodeModeFromSettings() {