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

时间:2016-09-20 08:54:36

标签: swift swift3 tvos

问题:

如何在tvOS中向AVPlayer添加外部WebVTT文件?

说明

我一直在关注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

3 个答案:

答案 0 :(得分:1)

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

不打算手动添加字幕..虽然我确实找到了一个显示黑客的StackOverflow帖子。不确定它是否有效。

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

答案 1 :(得分:0)

这对我有用。……

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

答案 2 :(得分:-1)

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

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