如何在 tvOS 中将外部 .vtt 字幕文件添加到 AVPlayerViewController

How to add external .vtt subtitle file to AVPlayerViewController in tvOS

问题:

如何在 tvOS 中将外部 WebVTT 文件添加到我的 AVPlayer?

描述:

我一直在看 this "What's New in HTTP Live Streaming" by Apple 他们谈论实现外部 WebVTT 文件的不同方法。

整个字幕域对我来说都很新,所以我很难很好地掌握这个概念。在视频中,他们谈论了许多我不太了解的不同事物,例如(字幕播放列表)。但是,通过所有我主要关心的是将 .vtt 文件添加到我的 AVPlayer。

在视频中他们谈到了这个 AVMediaSelectionGroup() 但我对如何使用以及如何在我的 AVPlayerViewController 中实现它感到很困惑 :

class PlayerViewController: AVPlayerViewController {

    override func viewDidLoad() {
        self.setupVideoPlayerView()
    }

    private func setupVideoPlayerView()
    {
        let path = "https://link.to.my.video.mp4"
        let subTitlePath = "https://link.to.my.webvtt.file.vtt"

        let nsURL = URL(string: path)

        let avPlayer = AVPlayer(url: nsURL!)

        self.player = avPlayer

        self.player!.seek(to: kCMTimeZero)
        self.player!.play()

    }
}

AVMediaSelectionGroup好像没有加字幕的方法?我能找到的最接近的东西(提到字幕)是以下方法:

//Where self is the instance of AVPlayerViewController
self.allowedSubtitleOptionLanguages
self.requiresFullSubtitles

虽然苹果文档中几乎没有提及,但我在一篇文章中读到字幕需要嵌入 HLS stream

字幕不打算手动添加..虽然我确实发现了一个显示黑客攻击的 Whosebug post。不确定它是否有效。

看我用的是VIMEO Pro,提供的HLS流中嵌入了WebVTT字幕(我上传到vimeo的),解决了我的问题。

这对我有用......

let localVideoAsset = AVURLAsset(url: URL(string: url) ?? URL(string:"")!)

let videoPlusSubtitles = AVMutableComposition()

let videoTrack = videoPlusSubtitles.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)

do{

guard localVideoAsset.tracks.count > 0 else{
             // error msg
                return
            }

            try? videoTrack?.insertTimeRange(CMTimeRangeMake(start: CMTime.zero, duration: localVideoAsset.duration),
                                             of: localVideoAsset.tracks(withMediaType: .video)[0],
                                             at: CMTime.zero)
}

let subtitleURL = URL(fileURLWithPath: model.data?[self.selected].subtitlePath ?? "")
            let subtitleAsset = AVURLAsset(url: subtitleURL)

            let subtitleTrack = videoPlusSubtitles.addMutableTrack(withMediaType: .text, preferredTrackID: kCMPersistentTrackID_Invalid)
            do{
                guard subtitleAsset.tracks.count > 0 else{
                    //error msg
                    return
                }
                try? subtitleTrack?.insertTimeRange(CMTimeRangeMake(start: CMTime.zero, duration: localVideoAsset.duration),
                                                    of: subtitleAsset.tracks(withMediaType: .text)[0],
                                                    at: CMTime.zero)
            }
        let playerViewController = AVPlayerViewController()
        let player = AVPlayer(playerItem: AVPlayerItem(asset: videoPlusSubtitles))
        playerViewController?.player = player

        self.present(playerViewController ?? UIViewController(), animated: true) {
            self.videoPlaying = true
            self.playerViewController?.player?.play()
        }
    }

好的,我想我解决了这个问题。我一直在寻找一些解决方案,但我还没有找到,所以我实施了一个来工作。 我提供了一个带有解决方案的 SPM,它使用起来非常简单。所以我将其命名为 SimpleSubtitles。 它确实支持 WebVTT,没有样式,并且可以改进以支持其他格式

更多信息: https://github.com/peantunes/SimpleSubtitles