1

在网络上播放 Vimeo 视频会显示像这样的隐藏字幕控件。

在此处输入图像描述

如何使用 Vimeo/PlayerKit 在 iOS 上显示类似的控件?

我看了很多次,但根本没有找到有关播放器套件的文档。

4

1 回答 1

1

由于没有其他人提出答案,这就是我所做的。Vimeo/PlayerKit 中文本轨道的文档可在文件 Player.swift 和 RegularPlayer.swift 中找到。

由此我构建了一个 UIButton 子类 CloseCaptionButton,我在视频播放时将其显示在视频上,并允许用户切换音轨。

// A UIAlertAction subclass to pass language code to selected action.
class TaggedAlertAction: UIAlertAction {
    var languageCode: String?

    public convenience init(title: String?, languageCode: String?,  style: UIAlertAction.Style, handler: ((UIAlertAction) -> Void)? = nil) {
        self.init(title: title, style: style, handler: handler)
        self.languageCode = languageCode
    }
}

class CloseCaptionButton: UIButton {
    var languages: [PlayerKit.TextTrackMetadata]?

    func handleTapFrom(vc: UIViewController, videoPlayer: RegularPlayer) {
        guard let languages = languages else { return print("NIL LANGUAGES, Couldn't open language picker") }
        let alert = UIAlertController(title: "Pick Captions Language", message: nil, preferredStyle: .actionSheet)

        // Create an action item in alert for each language.
        languages.forEach({ (textTrack) in
        let languageCode = textTrack.language
        let name = textTrack.title
            alert.addAction(TaggedAlertAction(title: name, languageCode: languageCode, style: .default) { action in
                let identifier = (action as! TaggedAlertAction).languageCode
                self.selectTrackFor(identifier, videoPlayer: videoPlayer)

            })
        })

        // Last action item allows user to turn off captions (or cancel).
        alert.addAction(UIAlertAction(title: "Turn Off Captions", style: .default) { _ in
            videoPlayer.select(nil)
        })
        alert.popoverPresentationController?.sourceView = vc.view
        vc.present(alert, animated: true)
    }

    func selectTrackFor(_ languageCode: String?, videoPlayer: RegularPlayer) {
        guard let languageCode = languageCode else { return print("NIL IDENTIFIER") }
        let matches = videoPlayer.availableTextTracks.filter({ (track) -> Bool in
            return track.language == languageCode
        })
        guard let match = matches.first else {
            return print("No match for language: \(languageCode)")
        }
        videoPlayer.select(match)
    }

    // Configure with player.availableTextTracks
    func configure(_ tracks: [PlayerKit.TextTrackMetadata]) {
        languages = Languages(trackMetadata: tracks)
    }
}

// How to use
closeCaptionButton.configure(videoPlayer.availableTextTracks)

@IBAction func ccButtonTapped(_ sender: Any) {
    closeCaptionButton.handleTapFrom(vc: self, videoPlayer: videoPlayer)
}

请享受!

于 2020-09-09T01:15:14.263 回答