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

时间:2018-03-21 16:58:04

标签: ios tvos avplayerviewcontroller

使用AVPlayerViewController时,系统允许用户选择字幕是使用特定语言off还是设置为auto。设置requiresFullSubtitles属性我可以强制显示字幕,但这不是我想要的。

有没有办法检测用户为字幕设置选择了什么,是否选择了某种语言,off还是auto

Now Playing Info Center

2 个答案:

答案 0 :(得分:1)

您可以获取当前选定的语言选项&当它用于设置字幕或音轨时,也会抓取语言信息,如" Adding Subtitles and Alternative Audio Tracks."

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

他们是AVMediaSelectionGroup还是AVMediaCharacteristicAudible ...

分组在AVMediaCharacteristicLegible

currently selected option位于:

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

它可以返回nil所以"无,"或者它将返回选择的任何语言。因此,您可以设置一些自定义' didChange'该财产的倾听者。似乎没有任何形式的公开通知,所以你必须自己制作。

每当您在播放器上选择/设置字幕选项时,您可以捕获并使用相同的信息来执行您打算用它做的任何事情:

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)
    }
}

答案 1 :(得分:1)

mc01的答案是正确的,但是如果你想要一个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
}