From 09f1f6bf5b1e2df8129ae06d24e43fa19a0f15ed Mon Sep 17 00:00:00 2001 From: kintan Date: Wed, 8 Nov 2023 21:28:04 +0800 Subject: [PATCH] fix #604 --- Sources/KSPlayer/AVPlayer/KSOptions.swift | 1 - Sources/KSPlayer/AVPlayer/KSVideoPlayer.swift | 2 +- .../KSPlayer/MEPlayer/EmbedDataSouce.swift | 6 ------ .../KSPlayer/MEPlayer/FFmpegAssetTrack.swift | 16 ++++++++------ Sources/KSPlayer/MEPlayer/FFmpegDecode.swift | 1 - Sources/KSPlayer/MEPlayer/MEPlayerItem.swift | 6 +----- Sources/KSPlayer/Subtitle/KSSubtitle.swift | 6 +++--- .../KSPlayer/Subtitle/SubtitleDataSouce.swift | 21 ++++++++++--------- Sources/KSPlayer/Video/VideoPlayerView.swift | 2 +- 9 files changed, 27 insertions(+), 34 deletions(-) diff --git a/Sources/KSPlayer/AVPlayer/KSOptions.swift b/Sources/KSPlayer/AVPlayer/KSOptions.swift index ba84ba5d7..64a5450db 100644 --- a/Sources/KSPlayer/AVPlayer/KSOptions.swift +++ b/Sources/KSPlayer/AVPlayer/KSOptions.swift @@ -74,7 +74,6 @@ open class KSOptions { public var audioLocale: Locale? // sutile public var autoSelectEmbedSubtitle = true - public var subtitleDisable = false public var isSeekImageSubtitle = false // video public var display = DisplayEnum.plane diff --git a/Sources/KSPlayer/AVPlayer/KSVideoPlayer.swift b/Sources/KSPlayer/AVPlayer/KSVideoPlayer.swift index 30567702f..36353bd8e 100644 --- a/Sources/KSPlayer/AVPlayer/KSVideoPlayer.swift +++ b/Sources/KSPlayer/AVPlayer/KSVideoPlayer.swift @@ -220,7 +220,7 @@ extension KSVideoPlayer.Coordinator: KSPlayerLayerDelegate { guard let self else { return } self.subtitleModel.addSubtitle(dataSouce: subtitleDataSouce) if self.subtitleModel.selectedSubtitleInfo == nil, layer.options.autoSelectEmbedSubtitle { - self.subtitleModel.selectedSubtitleInfo = subtitleDataSouce.infos.first + self.subtitleModel.selectedSubtitleInfo = subtitleDataSouce.infos.first { $0.isEnabled } } } } diff --git a/Sources/KSPlayer/MEPlayer/EmbedDataSouce.swift b/Sources/KSPlayer/MEPlayer/EmbedDataSouce.swift index 00e733c29..1a2582c72 100644 --- a/Sources/KSPlayer/MEPlayer/EmbedDataSouce.swift +++ b/Sources/KSPlayer/MEPlayer/EmbedDataSouce.swift @@ -9,12 +9,6 @@ import Libavcodec import Libavutil extension FFmpegAssetTrack: SubtitleInfo { - public func subtitle(isEnabled: Bool) { - if isImageSubtitle { - self.isEnabled = isEnabled - } - } - public var subtitleID: String { String(trackID) } diff --git a/Sources/KSPlayer/MEPlayer/FFmpegAssetTrack.swift b/Sources/KSPlayer/MEPlayer/FFmpegAssetTrack.swift index 47dd3ed45..4e1dcd0b6 100644 --- a/Sources/KSPlayer/MEPlayer/FFmpegAssetTrack.swift +++ b/Sources/KSPlayer/MEPlayer/FFmpegAssetTrack.swift @@ -83,17 +83,17 @@ public class FFmpegAssetTrack: MediaPlayerTrack { if codecpar.codec_type == AVMEDIA_TYPE_VIDEO { description += ", \(nominalFrameRate) fps" } - if let value = metadata["language"] { - language = Locale.current.localizedString(forLanguageCode: value) - } else { - language = nil - } + language = metadata["language"] if let value = metadata["title"] { name = value } else { name = language ?? mediaType.rawValue } description = name + ", " + description + // AV_DISPOSITION_DEFAULT + if mediaType == .subtitle { + isEnabled = !isImageSubtitle || stream.pointee.disposition & AV_DISPOSITION_FORCED == AV_DISPOSITION_FORCED + } // var buf = [Int8](repeating: 0, count: 256) // avcodec_string(&buf, buf.count, codecpar, 0) } @@ -226,7 +226,11 @@ public class FFmpegAssetTrack: MediaPlayerTrack { stream?.pointee.discard == AVDISCARD_DEFAULT } set { - stream?.pointee.discard = newValue ? AVDISCARD_DEFAULT : AVDISCARD_ALL + var discard = newValue ? AVDISCARD_DEFAULT : AVDISCARD_ALL + if mediaType == .subtitle, !isImageSubtitle { + discard = AVDISCARD_ALL + } + stream?.pointee.discard = discard } } } diff --git a/Sources/KSPlayer/MEPlayer/FFmpegDecode.swift b/Sources/KSPlayer/MEPlayer/FFmpegDecode.swift index 6fd41f623..345805985 100644 --- a/Sources/KSPlayer/MEPlayer/FFmpegDecode.swift +++ b/Sources/KSPlayer/MEPlayer/FFmpegDecode.swift @@ -51,7 +51,6 @@ class FFmpegDecode: DecodeProtocol { assetTrack.startTime = packet.assetTrack.startTime assetTrack.timebase = packet.assetTrack.timebase let subtitle = SyncPlayerItemTrack(assetTrack: assetTrack, options: options) - assetTrack.isEnabled = !assetTrack.isImageSubtitle assetTrack.subtitle = subtitle packet.assetTrack.closedCaptionsTrack = assetTrack subtitle.decode() diff --git a/Sources/KSPlayer/MEPlayer/MEPlayerItem.swift b/Sources/KSPlayer/MEPlayer/MEPlayerItem.swift index 89815bc30..f6f67f1e7 100644 --- a/Sources/KSPlayer/MEPlayer/MEPlayerItem.swift +++ b/Sources/KSPlayer/MEPlayer/MEPlayerItem.swift @@ -328,9 +328,8 @@ extension MEPlayerItem { coreStream.pointee.discard = AVDISCARD_ALL if let assetTrack = FFmpegAssetTrack(stream: coreStream) { assetTrack.startTime = startTime - if !options.subtitleDisable, assetTrack.mediaType == .subtitle { + if assetTrack.mediaType == .subtitle { let subtitle = SyncPlayerItemTrack(assetTrack: assetTrack, options: options) - assetTrack.isEnabled = !assetTrack.isImageSubtitle assetTrack.subtitle = subtitle allPlayerItemTracks.append(subtitle) } @@ -339,9 +338,6 @@ extension MEPlayerItem { } return nil } - if options.autoSelectEmbedSubtitle { - assetTracks.first { $0.mediaType == .subtitle }?.isEnabled = true - } var videoIndex: Int32 = -1 if !options.videoDisable { let videos = assetTracks.filter { $0.mediaType == .video } diff --git a/Sources/KSPlayer/Subtitle/KSSubtitle.swift b/Sources/KSPlayer/Subtitle/KSSubtitle.swift index 4f9174998..acb64160d 100644 --- a/Sources/KSPlayer/Subtitle/KSSubtitle.swift +++ b/Sources/KSPlayer/Subtitle/KSSubtitle.swift @@ -133,7 +133,7 @@ public protocol SubtitleInfo: KSSubtitleProtocol, AnyObject, Hashable, Identifia // var userInfo: NSMutableDictionary? { get set } // var subtitleDataSouce: SubtitleDataSouce? { get set } // var comment: String? { get } - func subtitle(isEnabled: Bool) + var isEnabled: Bool { get set } } public extension SubtitleInfo { @@ -299,8 +299,8 @@ open class SubtitleModel: ObservableObject { @Published public var selectedSubtitleInfo: (any SubtitleInfo)? { didSet { - oldValue?.subtitle(isEnabled: false) - selectedSubtitleInfo?.subtitle(isEnabled: true) + oldValue?.isEnabled = false + selectedSubtitleInfo?.isEnabled = true } } diff --git a/Sources/KSPlayer/Subtitle/SubtitleDataSouce.swift b/Sources/KSPlayer/Subtitle/SubtitleDataSouce.swift index 020f8eba1..c1e73261c 100644 --- a/Sources/KSPlayer/Subtitle/SubtitleDataSouce.swift +++ b/Sources/KSPlayer/Subtitle/SubtitleDataSouce.swift @@ -6,17 +6,26 @@ // import Foundation public class EmptySubtitleInfo: SubtitleInfo { + public var isEnabled: Bool = true public let subtitleID: String = "" public var delay: TimeInterval = 0 public let name = NSLocalizedString("no show subtitle", comment: "") public func search(for _: TimeInterval) -> [SubtitlePart] { [] } - - public func subtitle(isEnabled _: Bool) {} } public class URLSubtitleInfo: KSSubtitle, SubtitleInfo { + public var isEnabled: Bool = false { + didSet { + if isEnabled, parts.isEmpty { + Task { + try? await parse(url: downloadURL, userAgent: userAgent) + } + } + } + } + private var downloadURL: URL public var delay: TimeInterval = 0 public private(set) var name: String @@ -48,14 +57,6 @@ public class URLSubtitleInfo: KSSubtitle, SubtitleInfo { } } } - - public func subtitle(isEnabled: Bool) { - if isEnabled, parts.isEmpty { - Task { - try? await parse(url: downloadURL, userAgent: userAgent) - } - } - } } public protocol SubtitleDataSouce: AnyObject { diff --git a/Sources/KSPlayer/Video/VideoPlayerView.swift b/Sources/KSPlayer/Video/VideoPlayerView.swift index 805687882..5806ce2ae 100644 --- a/Sources/KSPlayer/Video/VideoPlayerView.swift +++ b/Sources/KSPlayer/Video/VideoPlayerView.swift @@ -268,7 +268,7 @@ open class VideoPlayerView: PlayerView { guard let self else { return } self.srtControl.addSubtitle(dataSouce: subtitleDataSouce) if self.srtControl.selectedSubtitleInfo == nil, layer.options.autoSelectEmbedSubtitle { - self.srtControl.selectedSubtitleInfo = self.srtControl.subtitleInfos.first + self.srtControl.selectedSubtitleInfo = self.srtControl.subtitleInfos.first { $0.isEnabled } } self.toolBar.srtButton.isHidden = self.srtControl.subtitleInfos.isEmpty if #available(iOS 14.0, tvOS 15.0, *) {