使用 AVPlayerViewController 时如何检测用户对字幕的选择

How to detect user selection of subtitles when using AVPlayerViewController

当使用 AVPlayerViewController 时,用户可以 select 字幕是否使用特定语言 off 或设置为 auto。设置 requiresFullSubtitles 属性 我可以强制显示字幕,但这不是我想要的。

有没有一种方法可以检测用户对字幕设置进行了 select 编辑,一种语言是 select 编辑、off 还是 auto

您可以获取当前选择的语言选项,也可以获取用于设置字幕或音轨的语言信息,如“Adding Subtitles and Alternative Audio Tracks.”中所述

可在视频资产的 availableMediaCharacteristics 数组中找到可用的字幕和音轨。

根据 AVMediaCharacteristicAudibleAVMediaCharacteristicLegible ...

,它们被分组在 AVMediaSelectionGroup

currently selected option 的发现者:

`func selectedMediaOption(in mediaSelectionGroup: AVMediaSelectionGroup) -> AVMediaSelectionOption?`

它可以 return nil 所以 "none," 或者它会 return 无论选择什么语言。因此,您可以在 属性 上设置一些自定义 'didChange' 侦听器。似乎没有任何形式的公开可用通知,因此您必须自己制作。

无论何时您 select/set 播放器上的字幕选项,您都可以捕获并使用相同的信息来做任何您想用它做的事情:

if let group = asset.mediaSelectionGroup(forMediaCharacteristic: AVMediaCharacteristicLegible) {
    let locale = Locale(identifier: "es-ES")
    let options =
        AVMediaSelectionGroup.mediaSelectionOptions(from: group.options, with: locale)
    if let option = options.first {

        /*** DO WHATEVER YOU WANT HERE AFTER CAPTURING THE LANGUAGE SELECTION  & RETRIEVING AN AVAILABLE SUBTITLE ***/ 

       playerItem.select(option, in: group)
    }
}

mc01 的答案是正确的,但是如果您想要 cut-and-paste 解决方案 Swift 4,那么结果是:

var selectedSubtitleLocale: Locale?

fileprivate func detectSubtitleLanguage() {
    var locale: Locale?

    if let playerItem = player?.currentItem,
        let group = playerItem.asset.mediaSelectionGroup(forMediaCharacteristic: AVMediaCharacteristic.legible) {
        let selectedOption = playerItem.currentMediaSelection.selectedMediaOption(in: group)
        locale = selectedOption?.locale
    }

    selectedSubtitleLocale = locale
}

在 iOS 13 和 tvOS 13

中出现了通知 AVPlayerItemMediaSelectionDidChangeNotification

您可以为您的 AVPlayerItem 订阅此通知:

if (@available(iOS 13.0, tvOS 13.0, *)) {
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(handleMediaSelectionChange:)
                                             name:AVPlayerItemMediaSelectionDidChangeNotification
                                           object:playerItem];
}

然后可以检测用户选择的语言或字幕:

- (void)handleMediaSelectionChange:(NSNotification *)notification {
    AVPlayerItem *playerItem = (AVPlayerItem *)notification.object;
    if([playerItem.asset isKindOfClass:[AVURLAsset class]]){
        AVURLAsset *asset = (AVURLAsset *)playerItem.asset;
        AVMediaSelectionGroup *audio = [asset mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicAudible];
        AVMediaSelectionGroup *subtitles = [asset mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicLegible];
        AVMediaSelectionOption *selectedAudio = [playerItem.currentMediaSelection selectedMediaOptionInMediaSelectionGroup:audio];
        AVMediaSelectionOption *selectedSubtitles = [playerItem.currentMediaSelection selectedMediaOptionInMediaSelectionGroup:subtitles];
    }
}